11

我试图将两个动画“链接”在一起,所以当一个完成时,另一个开始。除了一个问题外,这是可行的。第一个动画完成后,它会回到原来的位置。我将fill after设置为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,但将第二个动画的起始偏移设置为开始偏移 + 第一个动画的持续时间,再加上一点填充。在我的情况下,它们不必完全准确。

我尝试按照 CommonsWare 的建议使用各种值,但我总是会得到某种类型的“捕捉”效果,在采用新值之前,这些值会恢复到其原始值。

4

3 回答 3

8

我使用AnimationSet.Builder类找到了我认为是 API 级别 11 及更高级别的理想解决方案。

Builder 对象是一个实用程序类,用于方便将动画以及各种动画之间的关系添加到 AnimatorSet。Builder 方法以及 AnimatorSet 的 play() 方法的目的是使以自然的方式表达动画的依赖关系成为可能。如果需要,开发人员还可以使用 playTogether() 和 playSequentially() 方法,但在某些情况下,成对表示动画的 AnimatorSet 可能更容易

例如,这设置了一个 AnimatorSet 来同时播放 anim1 和 anim2,anim3 在 anim2 结束时播放,anim4 在 anim3 结束时播放:

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

第一个动画完成后,它会回到原来的位置。我将fill after设置为true。我还缺少什么?

动画是瞬态效果。如果您希望效果是永久性的,您必须自己在onAnimationEnd(). 在 a 的情况下TranslateAnimation,您需要更改LayoutParams受影响的小部件的 or 东西以将其永久保持在其结束位置。或者,如果您要将其翻译到屏幕外,请将可见性设置为View.GONE

于 2012-04-10T16:04:35.970 回答
2

尝试将它们组合成一个AnimationSet.

于 2012-04-10T15:58:41.290 回答