9

我有一个关于 Android 中的 ObjectAnimator 的问题。我正在尝试模拟一个反弹效果,其中视图向上滑动(减少 Y 值)并在相同的量“n”之后向后滑动,然后视图再次上下滑动,但这次是“n/2”(所以距离的一半)。

因此,较大的反弹,然后是较浅的反弹 - 即 Mac 图标在需要您注意时在托盘中所做的事情。

这是我到目前为止尝试过的(假设v是 a 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();

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

您能否告诉我如何创建不合并为一个的复杂 AnimatorSet 链,因为我似乎遗漏了一些东西?

奖励:对于加分,我如何设置 AnimatorSet 的重复?

非常感谢!

4

3 回答 3

27

好的,所以我最终找到了一种通过忽略流利的构建器来实现顺序动画的相当巧妙的方法,并且只使用以下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 的肮脏黑客之外,仍然没有重复。必须是一种更简单的方法,所以也许有人可以在他们知道的时候对其进行编辑。

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

于 2012-11-22T18:57:55.570 回答
3

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

于 2012-12-17T20:06:00.573 回答
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?) {}
            })
于 2020-08-15T13:37:06.883 回答