我想使用自定义属性为自定义视图位置设置动画,如下所示:
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中,是否可以使用ofMultiFloat
或ofMultiInt
方法通过属性设置器自动更改属性?
答案 0 :(得分:1)
从ObjectAnimator.ofMultiFloat()
的文档中您可以
在此变体中,坐标分别是设置器的第一个和第二个参数中使用的float x和y坐标。
因此不支持将数组作为该属性的参数,但可以使用多个参数。只需更改设置者的签名即可反映此要求:
@SuppressWarnings("unused")
public fun setFubPosition(x: Float, y: Float) {
this.x = x
this.y = y
}