ConstraintLayout.LayoutParams 视图上的动画立即结束

Animation on a view with ConstraintLayout.LayoutParams ends instantly

我目前正在尝试在启动 activity 时使用 Animation() 将视图的 matchConstraintPercentWidth 从 2 更改为 0(在方法 onWindowFocusChanged() 中以确保所有视图都已正确绘制)。问题是动画结束 instanlty(并且视图现在有新的参数 - 似乎动画的持续时间是 0 毫秒),无论我设置的持续时间...... 这是我的代码(在 Kotlin 中):

override fun onWindowFocusChanged(hasFocus: Boolean) {
        if (hasFocus) {
            val gradient = findViewById<ImageView>(R.id.black_gradient)
            val animation = object : Animation() {
                override fun applyTransformation(interpolatedTime: Float, t: Transformation?) {
                    val params = gradient.layoutParams as ConstraintLayout.LayoutParams
                    params.matchConstraintPercentWidth = 0f
                    gradient.layoutParams = params
                }
            }
            animation.duration = 2000L // in ms
            gradient.startAnimation(animation) //also tried animation.start() without effect
            //animation.hasStarted() is always false here
        }
    }

欢迎任何帮助 ;)

代码对我来说看起来不错,尝试删除 hasFocus 的条件,因为可能有一些视图可能在您应该诊断的这个特定的事情之前获得焦点是

  1. 尝试记录 hasFocus 如果它没有获得焦点然后更改代码如下代码,也只是一个提示 您应该始终在回调之外初始化视图。

     override fun onWindowFocusChanged(hasFocus: Boolean) {
                 val gradient = findViewById<ImageView>(R.id.black_gradient)
                 val animation = object : Animation() {
                     override fun applyTransformation(interpolatedTime: Float, t: Transformation?) {
                         val params = gradient.layoutParams as ConstraintLayout.LayoutParams
                         params.matchConstraintPercentWidth = 0f
                         gradient.layoutParams = params
                     }
                 }
                 animation.duration = 2000L // in ms
                 gradient.startAnimation(animation) //also tried animation.start() without effect
                 //animation.hasStarted() is always false here
         }
    

applyTransformation 方法是根据 interpolatedTime(介于 0.01.0 之间)计算动画的当前状态的地方.您只是将约束值设置为 0,因此它实际上并没有随时间更改值并为任何内容设置动画。

老实说,如果可以的话,你可能不想碰任何东西,Android 有一些助手 类 可以抽象出很多细节,所以你可以很容易地动画化一个东西。ValueAnimator 可能是一个很好的呼喊,你可以这样做

ValueAnimator.ofFloat(0f, 100f).apply {
    addUpdateListener { anim ->
        val params = (gradient.layoutParams as ConstraintLayout.LayoutParams)
        params.matchConstraintPercentWidth = anim.animatedValue as Float
    }
    duration = 1000
    start()
}

这应该等同于您正在做的事情。 link 处也有 ObjectAnimator,但这需要一个 setter 方法,并且没有一个用于该布局参数的方法(ConstraintProperties 有一些,但不是那个据我所知)