ObjectAnimator

我们发现,ValueAnimator使用起来,代码量还是比较多的,我们总是要注册一个监听器,来不停的获得当前值,然后根据这个值修改对象。 我们想要使用简单一些,所以提供了ObjectAnimator这个类。

ObjectAnimator关心到底是作用在那个对象上的哪个属性上。他也提供了很多以of开头的静态方法,用来创建自身的实例。这些方法如下:

public static ObjectAnimator ofArgb(Object target, String propertyName, int... values)
public static ObjectAnimator ofInt(Object target, String propertyName, int... values)
public static ObjectAnimator ofFloat(Object target, String propertyName, float... values)
public static ObjectAnimator ofObject(Object target, String propertyName, TypeEvaluator evaluator, Object... values)
public static ObjectAnimator ofPropertyValuesHolder(Object target, PropertyValuesHolder... values)

target通常是View和子类的实例,propertyNametarget对象中存在的属性, 而且target对象必须通过反射,能够调用他的setXXX方法,XXX就是把propertyName中的第一个字母大写后的。

下面是View这个类中提供的一些setter方法:

//1、透明度:alpha  
public void setAlpha(float alpha)  
  
//2、旋转度数:rotation、rotationX、rotationY  
public void setRotation(float rotation)  
public void setRotationX(float rotationX)  
public void setRotationY(float rotationY)  
  
//3、平移:translationX、translationY  
public void setTranslationX(float translationX)   
public void setTranslationY(float translationY)  
  
//4、缩放:scaleX、scaleY
public void setScaleX(float scaleX)  
public void setScaleY(float scaleY)  

示例1:

TextView tv = (TextView)findViewById(R.id.text_view);
ObjectAnimator.ofFloat(tv, "rotationX", 0, 270, 0).setDuration(2000).start();

等同于如下:

TextView tv = (TextView)findViewById(R.id.text_view);
ObjectAnimator animator = ObjectAnimator.ofFloat(tv, "rotationX", 0, 270, 0);
animator.setDuration(2000);  
animator.start();

等同于如下:

TextView tv = (TextView)findViewById(R.id.text_view);
ObjectAnimator animator = new ObjectAnimator();
animator.setTarget(tv);
animator.setPropertyName("rotationX");
animator.setFloatValues(0, 180, 0);
animator.setDuration(2000);
animator.start();