循环播放动画集会导致StackOverflowError

问题描述 投票:1回答:1

我正在分解一个Android应用程序,在其中我有一个无限重复的动画,这会引起StackOverflowError。当在同一对象上启动另一个动画时,便会执行此操作。

private fun pulse() {
    val randomGenerator = Random()

    val durationx = randomGenerator.nextInt(4000) + 1500

    val inflateX = ObjectAnimator.ofFloat(mContentView, "scaleX", 1.3f).apply {
        duration = durationx.toLong()
    }
    val inflateY = ObjectAnimator.ofFloat(mContentView, "scaleY", 1.3f).apply {
        duration = durationx.toLong()
    }
    val deflateX = ObjectAnimator.ofFloat(mContentView, "scaleX", 1.0f).apply {
        duration = durationx.toLong()
    }
    val deflateY = ObjectAnimator.ofFloat(mContentView, "scaleY", 1.0f).apply {
        duration = durationx.toLong()
    }
    val rotate = ObjectAnimator.ofFloat(mContentView, "rotation", 1.0f).apply {
        duration = durationx.toLong()
    }
    val soulToButton = AnimatorSet().apply {
        play(inflateX).with(inflateY)
        play(rotate).with(inflateX)
        play(deflateX).after(inflateX)
        play(deflateY).after(inflateY)
        start()
    }

    soulToButton.addListener(object: AnimatorListenerAdapter() {
        override fun onAnimationEnd(animation: Animator) {
            super.onAnimationEnd(animation)
            soulToButton.start() // stacktrace points to this line as cause for the error.
        }
    })
    soulToButton.start()

    AnimatorSet().apply {
        play(soulToButton)
        start()
    }
}

我尝试将功能更改为fun pulse(stop: boolean),在其他动画开始之前调用pulse(false)启动脉冲,然后调用pulse(true),然后在多个位置添加if (stop) {soulToButton.cancel()}。我也尝试换行以引起如下错误:while(stop == false){soultoButton.start()}

所有这些都无济于事。

android loops kotlin android-animation stack-overflow
1个回答
0
投票

是Kotlin,但它仍然是Java,并且所有JVM限制在这里都是相关的。因此,由于JVM堆栈受到限制,因此不能无限期地调用一个函数而不会引起StackOverflowError。

有一些特殊功能可以帮助您无限期地运行动画。例如

objectAnimator.setRepeatCount(ObjectAnimator.INFINITE);

或者您的情况

ObjectAnimator.ofFloat(mContentView, "scaleX", 1.3f).apply {
        duration = durationx.toLong()
        repeatCount = ObjectAnimator.INFINITE
    }

在以相同方式修改所有动画并将它们链接到AnimatorSet之后,其start函数将无限期播放此动画,而不会出现StackOverflowError。

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.