Android链动画

时间:2012-04-10 15:54:21

标签: 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建议的各种值,但我总是得到某种类型的“捕捉”效果,其中值在恢复之前会恢复到原始值。

3 个答案:

答案 0 :(得分:8)

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

  

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);

答案 1 :(得分:5)

  

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

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

答案 2 :(得分:2)

尝试将它们组合成AnimationSet