我有一个简单的比例动画:

val x = PropertyValuesHolder.ofFloat(View.SCALE_X, 0f, 2f)
val y = PropertyValuesHolder.ofFloat(View.SCALE_Y, 0f, 2f)
val grow = ObjectAnimator.ofPropertyValuesHolder(imageViews[j].starViews[3], x, y).apply {
    duration = 5000
}

imageView[].visibility = View.VISIBLE
AnimatorSet().play(grow)

当我将其添加到onTouchListener时,它可以很好地工作。但是,当我将其添加到onLongClickListener时,它不起作用。它仅可见,而动画不会发生
imageViews[j].starViews[2].setOnLongClickListener {
    if (!imageViews[j].done && imageViews[j].intermediate) {
        //The onTouchListener also has this if condition
        val x = PropertyValuesHolder.ofFloat(View.SCALE_X, 0f, 2f)
        val y = PropertyValuesHolder.ofFloat(View.SCALE_Y, 0f, 2f)
        val grow = ObjectAnimator.ofPropertyValuesHolder(imageView, x, y).apply {
        duration = 5000
        }

   imageView.visibility = View.VISIBLE
    AnimatorSet().apply {
        Log.d("animCall", "called")
        play(grow)
    }
    return@setOnLongClickListener true
   }
   return@setOnLongClickListener false
  }

最佳答案

您将要创建一个minimal, reproducible example。这是一个例子:

val x = PropertyValuesHolder.ofFloat(View.SCALE_X, 0f, 2f)
val y = PropertyValuesHolder.ofFloat(View.SCALE_Y, 0f, 2f)
val grow = ObjectAnimator.ofPropertyValuesHolder(imageview, x, y).apply {
    duration = 5000
}
imageview.setOnClickListener{
    grow.start()
}


imageview.setOnLongClickListener{
    grow.start()
    return@setOnLongClickListener true
}

通常,AnimatorSet用于一次触发多个动画,对于您的单个缩放动画,只需在scaleMid2上调用.start()就足够了。

OnClick和OnLongClick都制作了相同的动画,这使我相信您的问题是
  • if语句
  • .isFocusableInTouchMode =真行
  • 您问题中未表示的代码中的其他内容

  • 由于我拥有最低限度的可复制代码,因此可以将代码更改为此
    imageview.setOnLongClickListener{
        imageview.isFocusableInTouchMode = true
        grow.start()
        return@setOnLongClickListener true
    }
    

    并发现OnLongClickListener仍然可以正常工作(至少就我而言,这表明isFocusableInTouchMode是不必要的)。

    然后,我只能假设问题出在您的if语句或其他代码中,您可以按照前面的步骤自行解决。

    10-01 14:08
    查看更多