Android链动画

Ste*_*eve 11 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);
Run Code Online (Sandbox Code Playgroud)

解:

我能让这个让我满意的唯一方法是使用一个AnimationSet,但设置第二个动画的起始偏移量来开始第一个动画的偏移+持续时间,加上一点填充.在我的情况下,它们不一定非常精确.

我尝试使用CommonsWare建议的各种值,但我总是得到某种类型的"捕捉"效果,其中值在恢复之前会恢复到原始值.

Ste*_*eve 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);
Run Code Online (Sandbox Code Playgroud)


Com*_*are 5

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

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

  • AnimationSet.Builder最终成为我需要的东西:http://developer.android.com/reference/android/animation/AnimatorSet.Builder.html. (2认同)