Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何设置ImageView的动画,使其移动到随机值,并使该值在Kotlin中每次重复时都随机化?_Android_Kotlin_Animation - Fatal编程技术网

Android 如何设置ImageView的动画,使其移动到随机值,并使该值在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 :

我正在尝试为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 : 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()

(另外,它不是递归的,因为它实际上不是从函数本身调用函数——它是在稍后从交给动画师的函数对象内部调用函数。以防您担心!)