安卓 - AnimatorSet,Object Animator - 弹跳动画链合并?

9
我有一个关于Android的ObjectAnimator的问题。我正在尝试模拟反弹效果,即视图向上滑动(减小Y值),然后再向下同样的距离'n',紧接着视图再次向上下滑动,但这次距离是'n/2'(半个距离)。
因此,先是一个大的反弹,然后是一个更浅的反弹 - 即当Mac图标在托盘中想要引起您的注意时的情况。
这是我目前尝试过的代码(假设`v`是一个`View`):
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();

请忽略代码质量,这只是一个概念验证!我希望它能够工作,但似乎只会“弹跳”一次,好像已经合并了动画,尽管使用了 .before()

您能否告诉我如何创建不会合并成一个的复杂 AnimatorSet 链?因为我觉得可能漏掉了某些东西。

BONUS:额外加分,如何设置 AnimatorSet 的重复次数?

非常感谢!

3个回答

29

好的,最终我找到了一种相当不错的方法来实现序列动画,即通过忽略流畅构建器,只使用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的肮脏黑客方法之外。但一定有更简单的方法,也许在有人知道时可以编辑这个。

无论如何,希望以上内容对某人有所帮助。


如果您想重复使用动画,请使用http://www.jefflinwood.com/2013/04/repeating-android-animations-with-animatorset/。 - Martin Konecny
“dirty hack involving the callback onAnimationEnd in a listener” - 看起来文章描述了相同的方法。 - Darius
哦,我误读了你的评论。然而,对于动画精确结束时刻的回调在我看来并不算是一种肮脏的黑客行为。 - Martin Konecny
2
@MartinKonecny 这个问题仍然受到关注,所以我想说我不再认为它是一个肮脏的黑客了!可能是我在过去的六年里变得麻木了,或者可能是我变得更有经验了.. 或者两者都有! - Darius

3

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?) {}
            })

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