我对Android中的ObjectAnimator有疑问。我试图模拟一个Bounce效果,其中View向上滑动(降低Y值)并在向后滑动相同数量的'n',然后View再次向上和向下滑动,但这次是'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();
忽略代码质量,这是一个POC!我希望这会起作用,但它似乎只是“反弹”一次,好像它结合了动画,尽管使用了.before()
。
你能否告诉我如何创建复杂的AnimatorSet链,这些链没有合并到一个,因为我似乎缺少了什么?
BONUS:对于额外的积分,如何设置AnimatorSet的重复?
非常感谢!
答案 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?) {}
})