属性动画:ObjectAnimator
上一篇介绍的属性动画:ValueAnimator较为简单,会发现只能基于数值的变化对View进行设置,而且只能通过给ValueAnimator添加AnimatorUpdateListener监听器来监听数值变化,进而在回调方法中根据实时变化的数值设置View的属性。继续介绍属性动画中另一个更复杂的Animator,不再需要实现ValueAnimator.AnimatorUpdateListener,因为动画属性会自动更新。

1、ObjectAnimator简介
“ObjectAnimator是ValueAnimator的子类。提供对目标对象的动画设置的支持。此类的构造函数使用参数来定义将被动画化的目标对象以及将被动画化的属性的名称。然后在内部确定适当的set/get函数,动画将在必要时调用这些函数来设置属性动画。”
使用ObjectAnimator的时候,操作的属性必须有get和set方法,否则无法生效,所以对于没有set和get方法的属性,开发者可以自定义包装一个set和get属性。
ObjectAnimator支持使用PropertyValuesHolder和Keyframe在资源文件中创建更复杂的动画。使用PropertyValuesHolders可使动画师并行制作多个属性的动画。
2、Animator原理
详见Animator属性动画源码一文。

3、方法介绍
ObjectAnimator继承自ValueAnimator,因此ValueAnimator中的方法都可以使用。详细使用方法以后介绍,有一些高级的方法涉及到Property、PropertyValuesHolder、TypeEvaluator后面单独介绍详细使用。
3.1、of方法
①ObjectAnimator ofArgb (Object target, String propertyName, int... values)
②ObjectAnimator ofArgb (T target, Property<T, Integer> property, int... values)
③ObjectAnimator ofFloat (Object target,String xPropertyName, String yPropertyName, Path path)
④ObjectAnimator ofFloat (T target, Property<T, Float> property, float... values)
⑤ObjectAnimator ofFloat (T target, Property<T, Float> xProperty, Property<T, Float> yProperty, Path path)
⑥ObjectAnimator ofFloat (Object target, String propertyName, float... values)
⑦ObjectAnimator ofInt (T target, Property<T, Integer> xProperty, Property<T, Integer> yProperty, Path path)
⑧ObjectAnimator ofInt (T target, Property<T, Integer> property,int... values)
⑨ObjectAnimator ofInt (Object target,String propertyName, int... values)
⑩ObjectAnimator ofInt (Object target, String xPropertyName,String yPropertyName, Path path)
⑪ObjectAnimator ofMultiFloat (Object target, String propertyName, float[][] values)
⑫ObjectAnimator ofMultiFloat (Object target, String propertyName, Path path)
⑬ObjectAnimator ofMultiFloat (Object target, String propertyName, TypeConverter<T, float[]> converter, TypeEvaluator<T> evaluator, T... values)
⑭ObjectAnimator ofMultiInt (Object target, String propertyName, int[][] values)
⑮ObjectAnimator ofMultiInt (Object target, String propertyName, TypeConverter<T, int[]> converter, TypeEvaluator<T> evaluator, T... values)
⑯ObjectAnimator ofMultiInt (Object target, String propertyName, Path path)
⑰ObjectAnimator ofObject (T target, Property<T, P> property, TypeConverter<V, P> converter, TypeEvaluator<V> evaluator, V... values)
⑱ObjectAnimator ofObject (T target, Property<T, V> property, TypeEvaluator<V> evaluator, V... values)
⑲ObjectAnimator ofObject (Object target, String propertyName, TypeConverter<PointF, ?> converter, Path path)
⑳ObjectAnimator ofObject (Object target, String propertyName, TypeEvaluator evaluator, Object... values)
㉑ObjectAnimator ofObject (T target, Property<T, V> property, TypeConverter<PointF, V> converter, Path path)
㉒ObjectAnimator ofPropertyValuesHolder (Object target, PropertyValuesHolder... values)
3.2、set方法
①setAutoCancel(boolean cancel)
②ObjectAnimator setDuration(long duration)
③setFloatValues(float... values)
④setIntValues(int... values)
⑤setObjectValues(Object... values)
⑥setProperty(Property property)
⑦setPropertyName(String propertyName)
⑧setTarget(Object target)
⑨setupEndValues()
⑩setupStartValues()
3.3、get方法
①getNameForTrace():返回此动画制作器的名称以进行调试,框架调用,开发无法调用因为默认包访问权限
②getPropertyName():获取将设置动画的属性的名称,即构造传入的propertyName参数
③Object getTarget():动画对象
3.4、其它方法
①start():开始ObjectAnimator属性动画
②ObjectAnimator clone():克隆一个一模一样的ObjectAnimator实例
4、示例
用ObjectAnimator实现四种补间动画:旋转、平移、放缩、透明度。
4.1、alpha
①使用ofInt()方法获取ObjectAnimator实例:设置ImageView的 "alpha" 透明度属性,内部会通过反射调用setAlpha方法。
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mImageView, "alpha", 0.3f, 1.0f);
②设置TypeEvaluator估值器
objectAnimator.setEvaluator(new FloatEvaluator());
③其它一些设置,之后start()开始属性动画
objectAnimator.setDuration(1500);

4.2、translate
通用,只需要修改第二个参数propertyName,修改为“translationX”,就会在ObjectAnimator属性动画执行的时候调用对应的setTranslationX()方法
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mImageView, "translationX", 0, 400);
objectAnimator.setEvaluator(new FloatEvaluator());
objectAnimator.setDuration(1500);
objectAnimator.start();

4.3、rotate
View的旋转动效,只需要调用setRotation()方法,传入对应的“rotation”属性名即可。
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mImageView, "rotation", 0, 360);
objectAnimator.setEvaluator(new FloatEvaluator());
objectAnimator.setInterpolator(new BounceInterpolator());
objectAnimator.setDuration(1500);
objectAnimator.start();

4.4、scale
放缩有X、Y轴两个方向,要想达到同时放缩的效果,需要借助Animator属性动画集合,构造两个ObjectAnimator属性动画,分别设置"scaleX"、"scaleY",然后借助AnimatorSet的playTogether(Animator... items)将若干个动画组合,最后一起播放。关于Animator后面单独介绍。
AnimatorSet animatorSet = new AnimatorSet();
ObjectAnimator objectAnimatorX = ObjectAnimator.ofFloat(mImageView, "scaleX", 1f, 1.3f);
ObjectAnimator objectAnimatorY = ObjectAnimator.ofFloat(mImageView, "scaleY", 1f, 1.3f);
objectAnimatorX.setEvaluator(new FloatEvaluator());
objectAnimatorY.setEvaluator(new FloatEvaluator());
animatorSet.setInterpolator(new AnticipateOvershootInterpolator());
animatorSet.setDuration(1500);
animatorSet.playTogether(objectAnimatorX, objectAnimatorY);
animatorSet.start();

因为属性动画设置的是View的真实属性,所以动画呈现的效果也是View的真实属性,可以在动画结束的位置点击,操作。关于ObjectAnimator属性动画,还有TypeEvaluator、AnimatorSet、Property、PropertyValuesHolder等相关的类后面再继续了解。
相关博客:
Android Developers > Docs > Reference > ObjectAnimator
Animate using ObjectAnimator
Android 属性动画框架 ObjectAnimator、ValueAnimator
ObjectAnimator动画的使用
Animation动画——ObjectAnimator基本使用
ObjectAnimator属性动画源码分析篇