Android Kotlin - 动画后重置位置

Android Kotlin - reset position after animation

我正在制作滑动动画,这是在 onCreate 中:

val distance = swipe.left.toFloat()

anim = swipe.animate().rotationBy(-30f).setDuration(1000) // SWIPE TO LEFT
    .translationX(-distance)
    .setInterpolator(AccelerateDecelerateInterpolator())

anim!!.setListener(object : Animator.AnimatorListener {
    override fun onAnimationRepeat(animation: Animator?) {}
    override fun onAnimationCancel(animation: Animator?) {}
    override fun onAnimationStart(animation: Animator?) {}

    override fun onAnimationEnd(animation: Animator?) {
        swipe.animate().rotationBy(30f).setDuration(300)
            .translationX(distance)
            .setInterpolator(AccelerateDecelerateInterpolator()).start() // RESET THE POSITION BY SWIPING BACK TO RIGHT

        Log.d("pikaboo", "wth")
    }
})

anim!!.start()

如您所见,我尝试在 onAnimationEnd 中重置它,但随后我每秒打印多次 wth,并且滑动视图消失了!

这里有什么问题?如何重置和重复动画?

当您在 View 上调用 animate 时,它 returns 与 View - which is a singleton 关联的 ViewPropertyAnimator 实例,即只有一个,每次调用 animate

时都会返回

This class is not constructed by the caller, but rather by the View whose properties it will animate. Calls to View.animate() will return a reference to the appropriate ViewPropertyAnimator object for that View.

因此您调用 animate 并将 ViewPropertyAnimator 结果保存为 anim,然后在其上设置动画侦听器。你的监听器有它的 onAnimationEnd 函数,它在同一个视图上启动一个新的动画,这意味着它使用相同的 ViewPropertyAnimator (anim),它有一个监听器集来启动一个新的动画当这个结束时...看到我要去哪里了吗?你给自己带来了一个永无止境的循环!

您最好的选择可能是使用一次性结束动画,无论如何您都可以使用流畅的 animate 语法来完成!不需要听众。试试这个:

anim = swipe.animate().rotationBy(-30f).setDuration(1000) // SWIPE TO LEFT
    .translationX(-distance)
    .setInterpolator(AccelerateDecelerateInterpolator())
    .withEndAction {
        swipe.animate().rotationBy(30f).setDuration(300)
            .translationX(distance)
        
       .setInterpolator(AccelerateDecelerateInterpolator()).start()
    }

无法修复那里的格式(对于一个关于编程的网站来说,使用这些答案中的代码真的很困难)但是是的 - 你可以通过将其中的一些变成一个函数来清理它(因为它是同样的事情,只是负值)


此外,您可能应该将 anim 设置为 lateinit var,而不是可以为 nullable 并在任何地方执行 !!,这是一个不好的迹象,它最终总是会带来麻烦!