我有一个动画来摆动一个按钮。我希望它在每个循环之间有一个延迟无限地重复。
我尝试在
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