2012-04-10 17 views
10

2つのアニメーションを一緒に「チェーン」しようとしているので、もう一方が完了するともう一方が始まります。これは1つの問題を除いて動作しています。最初のアニメーションが完了すると、元の位置に戻ります。私は真実の後に記入を設定しています。ほかに何が足りないのですか?Android Chain Animation

ここに私が使用しているコードがあります。これはLinearLayoutを拡張しているクラスにあります。

// FIRST ANIMATION 
mAnimation = new TranslateAnimation(0, PANEL_END_X, 0, 0); 
mAnimation.setDuration(PANEL_TRANSITION_TIME); 
mAnimation.setFillAfter(true); 

mAnimation.setAnimationListener(new Animation.AnimationListener() { 
    public void onAnimationEnd(Animation animation) { 

     // FIRST ANIMATION COMPLETE, CALL THE SECOND ANIMATION 
     startAnimation(mAlphaAnimation); 
    } 
}); 

// SECOND ANIMATION  
mAlphaAnimation = new AlphaAnimation(1.0f, 0.0f); 
mAlphaAnimation.setDuration(PANEL_ALPHA_TRANSITION_TIME); 
mAlphaAnimation.setFillAfter(true); 

ソリューション:私はこれが私の満足に動作するように得ることができる

唯一の方法は、AnimationSetを使用していたが、最初のアニメーションの+オフセット期間を開始するために、第2のアニメーションの開始オフセットを設定します少々詰め物。彼らは私の場合は完全に正確である必要はありませんでした。

CommonsWareが示唆しているようにさまざまな値で試してみましたが、新しい値を取る前に値が元の値に戻ってしまうようなタイプの「スナップ」効果が常に得られます。

答えて

5

最初のアニメーションが完了した後、元の位置に戻ります。私は真実の後に記入を設定しています。ほかに何が足りないのですか?

アニメーションは一時的な効果です。エフェクトを永続させたい場合は、onAnimationEnd()でそれを行う必要があります。 TranslateAnimationの場合は、LayoutParamsまたは影響を受けるウィジェットの何かを変更して、最終位置に永久に保持する必要があります。または、画面外で翻訳している場合は、可視性をView.GONEに設定します。

+2

AnimationSet.Builderは、私が必要としていたものです。http://developer.android.com/reference/android/animation/AnimatorSet.Builder.html。 – Steve

2

AnimationSetに組み合わせてみてください。

+0

はしかし同時にそれらの両方を実行しませんか?あるアニメーションがもう一方のアニメーションが完了した後に開始したい。 – Steve

+0

はい、そうです、申し訳ありません。私はJavadocでこのフレーズを誤解しました。「子アニメーションの変形は、追加された順番で適用されます」 –

+0

その文は混乱していて、私の望むことを暗示しているようです。とにかく、ありがとう。 – Steve

8

AnimationSet.Builderクラスを使用して、APIレベル11以上の理想的なソリューションと考えていることが見つかりました。

Builderオブジェクトは、さまざまなアニメーション間の関係とともにアニメーションをAnimatorSetに追加するためのユーティリティクラスです。 AnimatorSetのplay()メソッドとともに、Builderメソッドの意図は、自然な方法でアニメーションの依存関係を表現できるようにすることです。開発者は、必要に応じてplayTogether()メソッドとplaySequentially()メソッドを使用することもできますが、アニメーションのAnimatorSetをペアで表現する方が簡単な場合があります。

たとえば、animator1を再生するようにAnimatorSetを設定します同時に、anim2仕上げ再生するanim3、および再生するanim4 anim3仕上げでanim2:

AnimatorSet s = new AnimatorSet(); 
s.play(anim1).with(anim2); 
s.play(anim2).before(anim3); 
s.play(anim4).after(anim3); 
+0

これはAPIレベル11以上でのみ利用可能であるため、Android 1.x/2.xデバイスでは使用できません。 – CommonsWare