11

2つのアニメーションを「チェーン」しようとしているので、一方が完了すると、もう一方が始まります。これは、1つの問題を除いて機能しています。最初のアニメーションが完了すると、元の位置に戻ります。塗りつぶしをtrueに設定しています。他に何が欠けていますか?

これが私が使用しているコードです。これは、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が提案するようにさまざまな値で遊んでみましたが、新しい値を取得する前に値が元の値に戻るという、ある種の「スナップ」効果が常に得られました。

4

3 に答える 3

8

AnimationSet.Builderクラスを使用して、APIレベル11以上で理想的なソリューションであると私が信じているものを見つけました。

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

たとえば、これは、anim1とanim2を同時に再生するようにAnimatorSetを設定し、anim2が終了したときに再生するようにanim3を設定し、anim3が終了したときに再生するようにanim4を設定します。

AnimatorSet s = new AnimatorSet();
s.play(anim1).with(anim2);
s.play(anim2).before(anim3);
s.play(anim4).after(anim3);
于 2012-04-11T23:40:41.947 に答える
5

最初のアニメーションが完了すると、元の位置に戻ります。塗りつぶしをtrueに設定しています。他に何が欠けていますか?

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

于 2012-04-10T16:04:35.970 に答える
2

それらを組み合わせてみてくださいAnimationSet

于 2012-04-10T15:58:41.290 に答える