Android - AnimatorSet,Object Animator - Bounce动画链是合并?

时间:2012-11-16 23:44:55

标签: android animation

我对Android中的ObjectAnimator有疑问。我试图模拟一个Bounce效果,其中View向上滑动(降低Y值)并在向后滑动相同数量的'n',然后View再次向上和向下滑动,但这次是'n / 2'(所以一半的距离)。

所以更大的弹跳,然后是更浅的反弹 - 也就是说,当它需要你注意时,Mac图标在托盘中的作用有点像。

以下是我到目前为止所尝试的内容(假设vView):

float y = v.getTranslationY(),distance = 20F;

                AnimatorSet s = new AnimatorSet();
                s.play(ObjectAnimator.ofFloat(v, "translationY", y- distance).setDuration(500))
                .before(ObjectAnimator.ofFloat(v, "translationY", y).setDuration(500))
                .before(ObjectAnimator.ofFloat(v, "translationY", y- (distance/2)).setDuration(500))
                .before(ObjectAnimator.ofFloat(v, "translationY", y).setDuration(500));
                s.start();

忽略代码质量,这是一个POC!我希望这会起作用,但它似乎只是“反弹”一次,好像它结合了动画,尽管使用了.before()

你能否告诉我如何创建复杂的AnimatorSet链,这些链没有合并到一个,因为我似乎缺少了什么?

BONUS:对于额外的积分,如何设置AnimatorSet的重复?

非常感谢!

3 个答案:

答案 0 :(得分:21)

好的,所以我最终找到了一种相当简洁的方法,通过忽略流畅的构建器来实现顺序动画,并且只使用playSequentially()方法:

AnimatorSet as = new AnimatorSet();
as.playSequentially(ObjectAnimator.ofFloat(...), // anim 1
                    ObjectAnimator.ofFloat(...), // anim 2
                    ObjectAnimator.ofFloat(...), // anim 3
                    ObjectAnimator.ofFloat(...)); // anim 4
as.setDuration(600);
as.start();

除了在监听器中涉及回调onAnimationEnd的肮脏黑客之外,还没有解决过。必须是一种更简单的方式,所以也许有人可以在知道一个时编辑它。

无论如何,希望以上帮助某人。

答案 1 :(得分:3)

当您使用Builder时,所有返回的依赖项都会引用第一个Animator,因此您在第一次移动后同时发生了3次跳转。不幸的是,似乎AnimatorSet在某些方面被打破,其中一个是重复:https://code.google.com/p/android/issues/detail?id=17662

答案 2 :(得分:0)

如果您使用的是 Kotlin ,请执行以下操作:

           val animationSet =  AnimatorSet();
            animationSet.playSequentially(cornerAnimation, colorChangeAnimator,cardElevationAnimator )
            animationSet.duration = ANIMATION_INTERVAL_MS;
            animationSet.start();
            animationSet.addListener(object :AnimatorUpdateListener, Animator.AnimatorListener {
                override fun onAnimationEnd(animation: Animator?) {
                    currentColor = toColor
                }
                override fun onAnimationUpdate(animation: ValueAnimator?) {}
                override fun onAnimationRepeat(animation: Animator?) {}
                override fun onAnimationCancel(animation: Animator?) {}
                override fun onAnimationStart(animation: Animator?) {}
            })