Android ObjectAnimator 如何识别属性 setter 方法?
How does Android ObjectAnimator recognize the attributes setter methods?
如果将属性 x
指定为字符串,ObjectAnimator 如何能够调用适当的方法 setX
?我的意思是,使用什么技术来识别我想为我的视图的属性 rotation
设置动画并调用该视图的适当方法 setRotation
?
我已经了解了ObjectAnimator的工作原理并成功使用了它,它很简单,我只是对操作原理感到好奇。
有多种方法可以为视图的旋转设置动画:
1. ObjectAnimator.ofFloat(view, "rotation", 0f, 90f).start();
这使用 reflection 调用视图的 setRotation(float f)
和 float getRotation()
方法。
只要 class 实现了适当的 getter 和 setter 方法,您就可以使用此方法为 class 的任何 属性 设置动画为此 属性.
但是反射是一个很慢的操作,所以还有第二种不使用反射的方法。
2. ObjectAnimator.ofFloat(view, View.ROTATION, 0f, 90f).start();
这使用视图的旋转 属性。 Property 是一个抽象 class,它定义了 setValue(T)
和 T get()
方法,这些方法依次调用所提供对象的实际 getter 和 setter .例如View
class上的旋转属性使用如下代码:
public static final Property<View, Float> ROTATION = new FloatProperty<View>("rotation") {
@Override
public void setValue(View object, float value) {
object.setRotation(value);
}
@Override
public Float get(View object) {
return object.getRotation();
}
};
如果您想为对象的自定义 属性 设置动画,您可以像上面那样实现自己的 属性。
还有第三种方法,同样没有使用反射
3. view.animate().rotation(90f);
这个有一个流畅的界面,所以它更容易使用。您还可以将多个动画链接到 运行 在一起,例如:view.animate().rotation(90f).translationX(10f);
此方法的缺点是您只能对视图的标准属性进行动画处理,而不能对自定义属性或您自己的属性进行动画处理classes。
如果将属性 x
指定为字符串,ObjectAnimator 如何能够调用适当的方法 setX
?我的意思是,使用什么技术来识别我想为我的视图的属性 rotation
设置动画并调用该视图的适当方法 setRotation
?
我已经了解了ObjectAnimator的工作原理并成功使用了它,它很简单,我只是对操作原理感到好奇。
有多种方法可以为视图的旋转设置动画:
1. ObjectAnimator.ofFloat(view, "rotation", 0f, 90f).start();
这使用 reflection 调用视图的 setRotation(float f)
和 float getRotation()
方法。
只要 class 实现了适当的 getter 和 setter 方法,您就可以使用此方法为 class 的任何 属性 设置动画为此 属性.
但是反射是一个很慢的操作,所以还有第二种不使用反射的方法。
2. ObjectAnimator.ofFloat(view, View.ROTATION, 0f, 90f).start();
这使用视图的旋转 属性。 Property 是一个抽象 class,它定义了 setValue(T)
和 T get()
方法,这些方法依次调用所提供对象的实际 getter 和 setter .例如View
class上的旋转属性使用如下代码:
public static final Property<View, Float> ROTATION = new FloatProperty<View>("rotation") {
@Override
public void setValue(View object, float value) {
object.setRotation(value);
}
@Override
public Float get(View object) {
return object.getRotation();
}
};
如果您想为对象的自定义 属性 设置动画,您可以像上面那样实现自己的 属性。
还有第三种方法,同样没有使用反射
3. view.animate().rotation(90f);
这个有一个流畅的界面,所以它更容易使用。您还可以将多个动画链接到 运行 在一起,例如:view.animate().rotation(90f).translationX(10f);
此方法的缺点是您只能对视图的标准属性进行动画处理,而不能对自定义属性或您自己的属性进行动画处理classes。