2012-12-14 13 views
43

を使用して余白を残し、私は次のように画像ビューの左余白を変更しています:アンドロイドは - 変更がアニメーション

ViewGroup.MarginLayoutParams layoutParams = (MarginLayoutParams) image.getLayoutParams(); 
layoutParams.leftMargin = VALUE; 
image.setLayoutParams (layoutParams); 

私はアニメーションで適用する余白の変更をしたいと思います。すべての手がかりは?私が試した何

ObjectAnimator objectAnimator = ObjectAnimator.ofFloat (image , "x" , VALUE); 
objectAnimator.start(); 

これは完璧に動作画像をアニメーションで指定されたX値に移動したように、layoutParams.leftMarginもつとも値は変わりません!このメソッドを使用することはできません。layoutParams.leftMarginの値を100に変更した後にobjectAnimatorという値を100に設定すると、適用される値が正しくないため、100の代わりに200が適用されるため、私は次のように左マージンを設定しています本家objectAnimatorが残っている場合:。

layoutParams.leftMargin = 100; 

答えて

117

使用Animationクラスではなく、ObjectAnimator

final int newLeftMargin = <some value>; 
Animation a = new Animation() { 

    @Override 
    protected void applyTransformation(float interpolatedTime, Transformation t) { 
     LayoutParams params = yourView.getLayoutParams(); 
     params.leftMargin = (int)(newLeftMargin * interpolatedTime); 
     yourView.setLayoutParams(params); 
    } 
}; 
a.setDuration(500); // in ms 
yourView.startAnimation(a); 

あなたは翔ますのでご注意くださいuldは正しいLayoutParamsクラスを使用します。つまり、ビューがLinearLayoutの子である場合、paramsはLinearLayout.LayoutParamsでなければなりません。

+0

私に正しい方向を教えていただきありがとうございます! :) – Leeeeeeelo

+12

持続時間を設定するのを忘れないでください。持続時間を設定するまでいくつかの問題がありました: 'a.setDuration(duration);' –

+0

params.leftMarginを使用しようとするとエラーが発生します。どうやら、それはフィールドではない – Soroush

68

この質問は私が出ましたが、マイナス値からマージンをアニメーション化したいので0ので、私はuser1991679答えにvalueAnimaterベースを使用:

final View animatedView = view.findViewById(R.id.animatedView); 
final LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) animatedView.getLayoutParams(); 
ValueAnimator animator = ValueAnimator.ofInt(params.bottomMargin, 0); 
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
    @Override 
    public void onAnimationUpdate(ValueAnimator valueAnimator) 
    { 
     params.bottomMargin = (Integer) valueAnimator.getAnimatedValue(); 
     animatedView.requestLayout(); 
    } 
}); 
animator.setDuration(300); 
animator.start(); 

あなたはanimatedViewコンテナに応じLinearLayout.LayoutParamsを変更する必要があります。 また、ValueAnimatorを持たない古いバージョンにnineoldandroidsを使用することもできます。

+0

Animationクラスを使用して、マージンを負から0にアニメートできます。制限はありません。 – user1991679

+0

@ user1991679 'Animation'クラスを使用して400から200にアニメーション化する方法はありますか? – StuStirling

+3

200がnewMargin(アニメーションする必要があるマージン)であり、400がcurrentMargin(アニメーション化されたマージン)であるとします。その場合、コードは次のようになります。 @Override protected void applyTransformation(float interpolatedTime、Transformation t){ LayoutParams params = yourView.getLayoutParams(); params.leftMargin = currentMargin - (int)((currentMargin - newMargin)* interpolatedTime); yourView.setLayoutParams(params); } – user1991679

-2

あなたはまた、アニメーションの外観を変更する.setInterpolator(new BounceInterpolator())を追加することができ、次の

image.animate().setDuration(durationIn).translationXBy(offsetFloat).start(); 

を使用することができます。

0

user1991679からの答えは素晴らしいですが、あなたが他の値が、0からマージンを補間する必要がある場合、あなたはあなたの計算でそれを使用する必要があります:私はアニメーション化するために必要な

ViewGroup.MarginLayoutParams params = (MarginLayoutParams) mBottomLayout.getLayoutParams(); 
final int bottomMarginStart = params.bottomMargin; // your start value 
final int bottomMarginEnd = <your value>; // where to animate to 
Animation a = new Animation() { 
    @Override 
    protected void applyTransformation(float interpolatedTime, Transformation t) { 
     ViewGroup.MarginLayoutParams params = (MarginLayoutParams) mBottomLayout.getLayoutParams(); 
     // interpolate the proper value 
     params.bottomMargin = bottomMarginStart + (int) ((bottomMarginEnd - bottomMarginStart) * interpolatedTime); 
     mBottomLayout.setLayoutParams(params); 
    } 
}; 
a.setDuration(300); 
mBottomLayout.startAnimation(a); 

を私の場合"-48dp"から "screen"アニメーションを入力し、0にします。開始値がなければ、アニメーションは常に0になり、ジャンプしてビューをアニメートしません。解決方法は、オフセットを補間して元の値に加算することでした。

関連する問題