我有一个动画来摆动一个按钮。我希望它在每个循环之间有一个延迟无限地重复。
我尝试在 doOnEnd 中使用 startDelay ,它运行得很好,但是 eventually caused a StackOverflowError 。
doOnEnd
startDelay
与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
使用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错误,但我不这么认为。
pause
resume
ObjectAnimator
带有延迟的 重复动画:
private fun ObjectAnimator.repeatWithDelay(delay: Long, lifecycleScope: LifecycleCoroutineScope) { repeatCount = ObjectAnimator.INFINITE doOnRepeat { pause() // pause animator lifecycleScope.launchWhenResumed { delay(delay) resume() // resume animator