具有自定义属性的ObjectAnimator不会调用属性设置器

时间:2018-06-30 06:50:53

标签: android animation kotlin

我想使用自定义属性为自定义视图位置设置动画,如下所示:

class ProgressFab : ImageView {

    // constructors ... etc

    val path = Path()

    init {
        path.moveTo(0f, 0f)
        path.lineTo(700f, 500f)
    }

    @SuppressWarnings("unused")
    public fun setFubPosition(path: FloatArray) {
        this.x = path[0]
        this.y = path[1]
    }

    fun startMotion() {
        val animator = ObjectAnimator.ofMultiFloat(this, "fubPosition", path)
        animator.duration = 5000

        animator.addUpdateListener {
//(1)       this.x = (it?.animatedValue as FloatArray)[0]
//(2)       this.y = (it?.animatedValue as FloatArray)[1]
            invalidate()
        }

        animator.start()
    }
}

调用startMotion()后,动画师将启动,但setFubPosition(path: FloatArray)不会被调用。如果我取消注释(1)和(2),一切正常。

这是反编译的kotlin字节码(看起来不错):

public final void setFubPosition(@NotNull float[] path) {
    Intrinsics.checkParameterIsNotNull(path, "path");
    this.setX(path[0]);
    this.setY(path[1]);
}

如果我尝试使用ofFloat方法为自定义属性设置动画,则属性设置器可以正常工作:

val animator = ObjectAnimator.ofFloat(this, "fubPosition", 0f, 100f);

在kotlin中,是否可以使用ofMultiFloatofMultiInt方法通过属性设置器自动更改属性?

1 个答案:

答案 0 :(得分:1)

ObjectAnimator.ofMultiFloat()的文档中您可以

  

在此变体中,坐标分别是设置器的第一个和第二个参数中使用的float x和y坐标。

因此不支持将数组作为该属性的参数,但可以使用多个参数。只需更改设置者的签名即可反映此要求:

@SuppressWarnings("unused")
public fun setFubPosition(x: Float, y: Float) {
    this.x = x
    this.y = y
}