我有一个动画来摆动一个按钮。我希望它在每个循环之间有一个延迟无限地重复。
我尝试在doOnEnd
中使用startDelay
,它运行得很好,但是eventually caused a StackOverflowError。
与startDelay一起使用doOnEnd (工作但导致如此错误):
val animator = ObjectAnimator
.ofFloat(premiumButton, "translationX", 0F, 25F, -25F, 25F, -25F, 15F, -15F, 6F, -6F, 0F)
.setDuration(2000L)
animator.doOnEnd {
it.startDelay = 10000
it.start()
}
animator.start()
接下来,我尝试使用一个AnimatorSet
,但是我的动画是不同的持续时间,所以不管我使用什么配置/属性(因为抖动是较短的动画),它只是不停地摆动,不会在抖动之间延迟。
使用AnimatorSet (因为动画的持续时间不同):
val animatorJiggle = ObjectAnimator
.ofFloat(myButton, "translationX", 0F, 25F, -25F, 25F, -25F, 15F, -15F, 6F, -6F, 0F)
.setDuration(2000)
.apply { repeatCount = ObjectAnimator.INFINITE }
val animatorDelay = ObjectAnimator
.ofFloat(myButton, "translationX", 0F)
.setDuration(10000)
.apply { repeatCount = ObjectAnimator.INFINITE }
AnimatorSet().apply {
playSequentially(animatorJiggle, animatorDelay)
// repeat(ObjectAnimator.INFINITE) { }
start()
}
如何在没有使用第一个解决方案的情况下,在每个循环之间得到一个延迟的动画循环(因为它会导致一个SO错误)?
发布于 2022-11-21 05:17:29
我找到了一个解决方案,使用pause
和resume
函数的ObjectAnimator
与协同。基本上,我暂停动画,等待延迟,然后继续。我不知道这是否会导致StackOverflow错误,但我不这么认为。
带有延迟的重复动画:
private fun ObjectAnimator.repeatWithDelay(delay: Long, lifecycleScope: LifecycleCoroutineScope) {
repeatCount = ObjectAnimator.INFINITE
doOnRepeat {
pause() // pause animator
lifecycleScope.launchWhenResumed {
delay(delay)
resume() // resume animator
}
}
}
使用它(在一个活动中):
val jiggleAnimator = ObjectAnimator
.ofFloat(myButton, "translationX", 0F, 25F, -25F, 25F, -25F, 15F, -15F, 6F, -6F, 0F)
.setDuration(2000)
jiggleAnimator.repeatWithDelay(10000, this@MyActivity.lifecycleScope)
jiggleAnimator.start()
您也可以使用use a timer或runnable,但是我选择使用协同,因为它更安全(您可以确保在某个活动被终止后,您没有尝试访问它的UI或变量)。
https://stackoverflow.com/questions/74514235
复制相似问题