如果将属性 x 指定为字符串,ObjectAnimator如何能够调用适当的方法 setX . 我的意思是,用什么技术来识别我想要为我的视图的属性"rotation"设置动画并调用该视图的相应方法setRotation?
x
setX
我已经理解了ObjectAnimator如何工作并设法使用它,它很简单,我只是对操作原理感到好奇 .
抱歉我的英文,我从不使用它:)
有许多方法可以为视图的旋转设置动画:
1. ObjectAnimator.ofFloat(view, "rotation", 0f, 90f).start();
ObjectAnimator.ofFloat(view, "rotation", 0f, 90f).start();
这使用reflection来调用视图的 setRotation(float f) 和 float getRotation() 方法 .
setRotation(float f)
float getRotation()
只要该类已为该属性实现了适当的getter和setter方法,就可以使用此方法为类的任何属性设置动画 .
但是反射是一个缓慢的操作,所以有第二种方法不使用反射 .
2. ObjectAnimator.ofFloat(view, View.ROTATION, 0f, 90f).start();
ObjectAnimator.ofFloat(view, View.ROTATION, 0f, 90f).start();
这使用视图的rotation属性 . Property是一个抽象类,它定义 setValue(T) 和 T get() 方法,这些方法又调用所提供对象的实际getter和setter . 例如, View 类上的rotation属性使用以下代码:
setValue(T)
T get()
View
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);
这个具有流畅的界面,因此更容易使用 . 您还可以将多个动画链接在一起运行,例如: view.animate().rotation(90f).translationX(10f);
view.animate().rotation(90f).translationX(10f);
此方法的缺点是,您只能为View的标准属性设置动画,而不能在自己的类上设置自定义属性或属性 .
1 回答
有许多方法可以为视图的旋转设置动画:
1.
ObjectAnimator.ofFloat(view, "rotation", 0f, 90f).start();
这使用reflection来调用视图的
setRotation(float f)
和float getRotation()
方法 .只要该类已为该属性实现了适当的getter和setter方法,就可以使用此方法为类的任何属性设置动画 .
但是反射是一个缓慢的操作,所以有第二种方法不使用反射 .
2.
ObjectAnimator.ofFloat(view, View.ROTATION, 0f, 90f).start();
这使用视图的rotation属性 . Property是一个抽象类,它定义
setValue(T)
和T get()
方法,这些方法又调用所提供对象的实际getter和setter . 例如,View
类上的rotation属性使用以下代码:如果要为对象的自定义属性设置动画,可以像上面那样实现自己的属性 .
然后是第三种方法,它也不使用反射 .
3.
view.animate().rotation(90f);
这个具有流畅的界面,因此更容易使用 . 您还可以将多个动画链接在一起运行,例如:
view.animate().rotation(90f).translationX(10f);
此方法的缺点是,您只能为View的标准属性设置动画,而不能在自己的类上设置自定义属性或属性 .