问题 Android链动画


我试图将两个动画“链接”在一起,所以当一个完成时,另一个开始。这是有效的,除了一个问题。第一个动画完成后,它会移回原来的位置。我设置填充后为真。我还缺少什么?

这是我正在使用的代码。请注意,这是在扩展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建议的各种值,但我会总是得到某种类型的“捕捉”效果,其中值在恢复之前将恢复到原始值。


11949
2018-04-10 15:54


起源



答案:


第一个动画完成后,它会移回原来的位置。我设置填充后为真。我还缺少什么?

动画是瞬态效应。如果你想让效果永久化,你必须自己做 onAnimationEnd()。在一个案例中 TranslateAnimation,你需要改变 LayoutParams 或受影响的小部件的某些内容,以永久保持其最终位置。或者,如果要将其从屏幕上翻译出来,请将可见性设置为 View.GONE


5
2018-04-10 16:04



AnimationSet.Builder最终成为我需要的东西: developer.android.com/reference/android/animation/...。 - Steve


答案:


第一个动画完成后,它会移回原来的位置。我设置填充后为真。我还缺少什么?

动画是瞬态效应。如果你想让效果永久化,你必须自己做 onAnimationEnd()。在一个案例中 TranslateAnimation,你需要改变 LayoutParams 或受影响的小部件的某些内容,以永久保持其最终位置。或者,如果要将其从屏幕上翻译出来,请将可见性设置为 View.GONE


5
2018-04-10 16:04



AnimationSet.Builder最终成为我需要的东西: developer.android.com/reference/android/animation/...。 - Steve


我发现了我认为是API级别11及以上的理想解决方案 AnimationSet.Builder 类。

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

例如,这会设置一个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);

8
2018-04-11 23:40



请注意,这仅适用于API级别11及更高版本,因此Android 1.x / 2.x设备无法使用它。 - CommonsWare


尝试将它们组合成一个 AnimationSet


2
2018-04-10 15:58



那不是同时执行它们吗?我希望一个动画在另一个动画完成后开始。 - Steve
是的,你是对的,对不起。我在Javadoc中误解了这句话:“儿童动画的变换按照添加的顺序应用” - Graham Borland
那句话令人困惑,似乎意味着它做了我想做的事。不管怎么说,多谢拉。 - Steve
我实际上最终使用了一个AnimationSet,但是将第二个动画的起始偏移设置为第一个的起始偏移量和第一个动画的持续时间。我尝试了CommonsWare的答案,虽然我相信它是理想的解决方案,但我可以得到我需要的效果。 - Steve
检查AnimationSet.Builder类: developer.android.com/reference/android/animation/...。 - Steve