安卓链式动画

11

我试图将两个动画“链接”在一起,这样当一个动画完成后,另一个动画就会开始。这个方法是有效的,但出现了一个问题。第一个动画完成后,它会移回原来的位置。我已将 fillAfter 设置为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建议的各种值,但总会出现某种“跳跃”效果,其中值会在采取新值之前恢复为其原始值。

3个回答

8
我认为在API 11及以上版本中,使用AnimationSet.Builder类是最理想的解决方案。Builder对象是一个实用类,可帮助将动画添加到AnimatorSet中,并确定各种动画之间的关系。 Builder方法与AnimatorSet的play()方法的意图是以一种自然的方式表达动画之间的依赖关系。如果需要,开发人员也可以使用playTogether()和playSequentially()方法,但在某些情况下,通过成对地表示动画的AnimatorSet可能更容易理解。例如,以下设置了一个AnimatorSet,使anim1和anim2同时播放,当anim2完成时播放anim3,当anim3完成时播放anim4:
AnimatorSet s = new AnimatorSet();
s.play(anim1).with(anim2);
s.play(anim2).before(anim3);
s.play(anim4).after(anim3);

请注意,此功能仅适用于API级别11及更高版本,因此Android 1.x/2.x设备无法使用。 - CommonsWare
1
不要像我一样忘记调用 s.start()。 - Peter

5
第一个动画完成后,它会移回原始位置。我已将fill after设置为true。我还需要做些什么?
动画是短暂的效果。如果你想让效果持久化,你需要在onAnimationEnd()方法中自己处理。在TranslateAnimation的情况下,你需要更改受影响的小部件的LayoutParams或其他内容,以便永久保留它在最终位置。或者,如果你将其从屏幕上移开,请将可见性设置为View.GONE。

2
AnimationSet.Builder 事实上正是我所需的:http://developer.android.com/reference/android/animation/AnimatorSet.Builder.html。 - Steve

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

那不是会同时执行它们两个吗?我想要一个动画在另一个完成后开始。 - Steve
是的,你说得对,抱歉。我误解了Javadoc中的这个短语:“子动画的变换应用顺序按照它们添加的顺序执行”。 - Graham Borland
那句话很令人困惑,似乎暗示它能做我想要的事情。无论如何,还是谢谢。 - Steve
我最终使用了AnimationSet,但将第二个动画的起始偏移设置为第一个动画的起始偏移加上第一个动画的持续时间。我尝试了CommonsWare的答案,虽然我认为这是理想的解决方案,但我无法得到我需要的效果。 - Steve
请查看AnimationSet.Builder类:http://developer.android.com/reference/android/animation/AnimatorSet.Builder.html。 - Steve
你可以将AnimationSets放在连续的位置上。 - Gerard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接