我正在分解一个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()}
所有这些都无济于事。
是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。
希望有帮助。