首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Android上的每一个循环之间重复一次动画

在Android上的每一个循环之间重复一次动画
EN

Stack Overflow用户
提问于 2022-11-21 04:25:42
回答 1查看 25关注 0票数 0

我有一个动画来摆动一个按钮。我希望它在每个循环之间有一个延迟无限地重复。

我尝试在doOnEnd中使用startDelay,它运行得很好,但是eventually caused a StackOverflowError

与startDelay一起使用doOnEnd (工作但导致如此错误):

代码语言:javascript
复制
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 (因为动画的持续时间不同):

代码语言:javascript
复制
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错误)?

EN

回答 1

Stack Overflow用户

发布于 2022-11-21 05:17:29

我找到了一个解决方案,使用pauseresume函数的ObjectAnimator与协同。基本上,我暂停动画,等待延迟,然后继续。我不知道这是否会导致StackOverflow错误,但我不这么认为。

带有延迟的重复动画:

代码语言:javascript
复制
private fun ObjectAnimator.repeatWithDelay(delay: Long, lifecycleScope: LifecycleCoroutineScope) {
    repeatCount = ObjectAnimator.INFINITE
    doOnRepeat {
        pause() // pause animator
        lifecycleScope.launchWhenResumed {
            delay(delay)
            resume() // resume animator
        }
    }
}

使用它(在一个活动中):

代码语言:javascript
复制
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或变量)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74514235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档