Android ObjectAnimator如何工作?

问题描述:

如果ObjectAnimator如果将属性x指定为字符串,它将如何调用相应的方法setX。我的意思是,用什么技术来识别我想动画我视图的属性“旋转”并调用该视图的适当方法setRotation?Android ObjectAnimator如何工作?

我已经理解了ObjectAnimator如何工作并设法使用它,这很简单,我只是对操作原理感到好奇。

对不起,我的英语,我从来没有使用它:)

+0

对于属性“foo”,setFoo方法通过reflaction调用 – pskink 2015-02-07 10:32:33

有多种方式以动画视图的旋转:

ObjectAnimator.ofFloat(view, "rotation", 0f, 90f).start();

这使用reflection到请致电setRotation(float f)float getRotation()视图的方法。

只要该类为该属性实现了适当的getter和setter方法,就可以使用此方法为类的任何属性设置动画。

但反射是一个缓慢的操作,所以有第二种方法不使用反射。

2.ObjectAnimator.ofFloat(view, View.ROTATION, 0f, 90f).start();

这使用旋转属性的视图。 Property是一个抽象类,它定义了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(); 
    } 
}; 

如果要动画对象的自定义属性,你可以实现自己的财产像上面的。

然后有第三种方法,它也不使用反射。

view.animate().rotation(90f);

这其中有一个流畅的接口,所以它更容易使用。例如:您可以将多个动画链接在一起运行,例如:view.animate().rotation(90f).translationX(10f);

此方法的缺点是只能对视图的标准属性进行动画制作,而不能在您自己的类上设置自定义属性或属性。

+1

呃,使用反射来生成动画Object声音太糟糕了,应该不可能! – Blablablabli 2017-02-22 09:24:14