Android 如何设置ImageView的动画,使其移动到随机值,并使该值在Kotlin中每次重复时都随机化?
我正在尝试为Kotlin中的图像视图创建振动动画 以下是我开始的代码:Android 如何设置ImageView的动画,使其移动到随机值,并使该值在Kotlin中每次重复时都随机化?,android,kotlin,animation,Android,Kotlin,Animation,我正在尝试为Kotlin中的图像视图创建振动动画 以下是我开始的代码: var randomX = Random.nextInt(-100, 100).toFloat() var moveX = ObjectAnimator.ofFloat(imageView, View.TRANSLATION_X, randomX).apply { duration = 100 repeatCount = ObjectAnimator.INFINITE addListener(object :
var randomX = Random.nextInt(-100, 100).toFloat()
var moveX = ObjectAnimator.ofFloat(imageView, View.TRANSLATION_X, randomX).apply {
duration = 100
repeatCount = ObjectAnimator.INFINITE
addListener(object : Animator.AnimatorListener {
override fun onAnimationStart(animation: Animator?) {}
override fun onAnimationEnd(animation: Animator?) {}
override fun onAnimationCancel(animation: Animator?) {}
override fun onAnimationRepeat(animation: Animator?) {
randomX = Random.nextInt(-100, 100).toFloat()
}
})
}
var randomY = Random.nextInt(-100, 100).toFloat()
var moveY = ObjectAnimator.ofFloat(imageView, View.TRANSLATION_Y, randomY).apply {
duration = 100
repeatCount = ObjectAnimator.INFINITE
addListener(object : Animator.AnimatorListener {
override fun onAnimationStart(animation: Animator?) {}
override fun onAnimationEnd(animation: Animator?) {}
override fun onAnimationCancel(animation: Animator?) {}
override fun onAnimationRepeat(animation: Animator?) {
randomY = Random.nextInt(-100, 100).toFloat()
}
})
}
var move = AnimatorSet()
move.playTogether(moveX, moveY)
move.start()
我遇到的问题是更改随机值,然后在每次重复时使用新的随机值更新动画。它总是只使用初始值。当动画重复时,您的监听器只是在更改那些
var
s,动画已经用原始值定义,因此循环时没有任何更改-它只是再次执行相同的操作
您可以通过每次基本上定义一个新动画来获得想要的效果-以下是一种方法:
fun randomPosition() = Random.nextInt(-100, 100).toFloat()
fun vibrate() {
imageView.animate()
.translationX(randomPosition())
.translationY(randomPosition())
.setDuration(100)
.withEndAction(::vibrate)
.start()
}
它基本上是在做这个事情,然后它有一个“结束动作”,它只是再次调用这个函数。因为它每次都创建一个新动画,所以它会获取一对新的随机值
如果需要,您还可以控制重复次数
fun vibrate(count: Int = 10) {
if (count < 1) return
imageView.animate()
.translationX(randomPosition())
.translationY(randomPosition())
.setDuration(100)
.withEndAction{ vibrate(count-1) }
.start()
}
fun振动(计数:Int=10){
如果(计数<1)返回
imageView.animate()
.translationX(随机位置())
.translationY(randomPosition())
.setDuration(100)
.withEndAction{振动(计数-1)}
.start()
}
它只是减少剩余振动的数量,直到你达到零,它停止动画。我使用了一个默认参数值,因此您可以在那里定义振动的标准数量,只需从使用它的任何地方调用vibrate()
(另外,它不是递归的,因为它实际上不是从函数本身调用函数——它是在稍后从交给动画师的函数对象内部调用函数。以防您担心!)