一、ObjectAnimator
ObjectAnimator顾名思义,继承自ValueAnimator,所以ValueAnimator所能使用的方法,ObjectAnimator也都可以使用,ObjectAnimator同时也重写了几个方法,比如:ofFloat()、ofInt()等。
public static ObjectAnimator ofFloat(Object target, String propertyName, float... values)
其实ObjectAnimator内部还提供了一个ofPropertyValuesHolder()方法,使用PropertyValuesHolder来构造动画。那PropertyValuesHolder又是什么呢?
public static ObjectAnimator ofPropertyValuesHolder(Object target, PropertyValuesHolder... values)
二、PropertyValuesHolder
PropertyValuesHolder这个类的意义就是,它其中保存了动画过程中所需要操作的属性和对应的值。它也有ofFloat()、ofInt()等方法,通过ofFloat(Object target, String propertyName, float… values)构造的动画,
public static PropertyValuesHolder ofFloat(String propertyName, float... values)
ofFloat()的内部实现其实就是将传进来的参数封装成PropertyValuesHolder实例来保存动画状态。在封装成PropertyValuesHolder实例以后,后期的各种操作也是以PropertyValuesHolder为主的。
三、ofFloat()、ofInt()参数:
propertyName:表示ObjectAnimator需要操作的属性名。也就是ObjectAnimator需要通过反射查找对应属性的setProperty()函数的那个property。ObjectAnimator做动画,并不是根据控件xml中的属性来改变的,而是通过指定属性所对应的set方法来改变的。比如下面这个例子指定改变scaleX()的属性值,
PropertyValuesHolder valueHolder = PropertyValuesHolder.ofFloat("scaleX", 1f, 0.9f);
ObjectAnimator在做动画时就会到指定控件(TextView,ImageView,Layout等) 中去找对应的setScaleX()方法来改变控件中对应的值。而在View中已经实现了有关alpha(透明度),rotaion(围绕Z轴旋转),rotationX(围绕X轴旋转),rotationY(围绕Y轴旋转),translationX(X轴平移),translationY(Y轴平移),scaleX(X轴缩放),scaleY(Y轴缩放)相关的set方法。所以可以在构造ObjectAnimator时可以直接使用。
values:属性所对应的参数,同样是可变长参数,可以指定多个,就是指这个属性值是从哪变到哪,像下面的例子意思是说改变scaleX的属性值从1f到0.9f,如果是三个就是从哪到哪再到哪,
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(this,"scaleX",1f,0.9f,1f);
objectAnimator.setDuration(2000);
objectAnimator.start();
如果只指定了一个,那么ObjectAnimator会通过查找getProperty()方法来获得初始值。
四、ofPropertyValuesHolder()参数:
target:是指需要执行动画的控件,传入this就是指当前这个自定义的View执行此动画。
values:是一个可变长参数,可以传进去多个PropertyValuesHolder实例,
ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(this, valueHolder_1, valuesHolder_2);
由于每个PropertyValuesHolder实例都会针对一个属性做动画,所以如果传进去多个PropertyValuesHolder实例,将会对控件的多个属性同时做动画操作。
PropertyValuesHolder valueHolder_1 = PropertyValuesHolder.ofFloat(
"scaleX", 1f, 0.9f);
PropertyValuesHolder valuesHolder_2 = PropertyValuesHolder.ofFloat(
"scaleY", 1f, 0.9f);
ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(this, valueHolder_1, valuesHolder_2);
objectAnimator.setDuration(200);
objectAnimator.setInterpolator(new LinearInterpolator());
downAnim.setEvaluator(new FloatEvaluator());
五、setInterpolator():插值器,控制动画的速度
android:interpolator="@android:anim/accelerate_interpolator"
animation.setInterpolator(new AccelerateInterpolator());
设置动画为加速动画(动画播放中越来越快)
android:interpolator="@android:anim/decelerate_interpolator"
animation.setInterpolator(new DecelerateInterpolator());
设置动画为减速动画(动画播放中越来越慢)
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
animation.setInterpolator(new AccelerateDecelerateInterpolator());
设置动画为先加速在减速(开始速度最快 逐渐减慢)
android:interpolator="@android:anim/anticipate_interpolator"
animation.setInterpolator(new AnticipateInterpolator());
先反向执行一段,然后再加速反向回来(相当于我们弹簧,先反向压缩一小段,然后在加速弹出)
android:interpolator="@android:anim/anticipate_overshoot_interpolator"
animation.setInterpolator(new AnticipateOvershootInterpolator());
同上先反向一段,然后加速反向回来,执行完毕自带回弹效果(更形象的弹簧效果)
android:interpolator="@android:anim/bounce_interpolator"
animation.setInterpolator(new BounceInterpolator());
执行完毕之后会回弹跳跃几段(相当于我们高空掉下一颗皮球,到地面是会跳动几下)
android:interpolator="@android:anim/cycle_interpolator"
animation.setInterpolator(new CycleInterpolator(2));
循环,动画循环一定次数,值的改变为一正弦函数:Math.sin(2* mCycles* Math.PI* input)
android:interpolator="@android:anim/linear_interpolator"
animation.setInterpolator(new LinearInterpolator());
线性均匀改变
android:interpolator="@android:anim/overshoot_interpolator"
animation.setInterpolator(new OvershootInterpolator());
加速执行,结束之后回弹
默认Interpolator是匀速改变
六、setEvaluator():根据数字进度计算当前值,插值器返回数字进度
计算Evaluator表达式:(位置 = 开始值 + (结束值 - 开始值) * 数字进度)
Evaluator是根据插值器也就是setInterpolator()返回的进度转换成当前位置所对应的值。
还要注意一点:只有在动画数值类型一样时,所对应的Evaluator才能通用。
所以ofInt()对应的Evaluator类名叫IntEvaluator,而ofFloat()对应的Evaluator类名叫FloatEvaluator。在设置 Evaluator 时,是通过 animator.setEvaluator()来设置的,可以直接使用IntEvaluator()和FloatEvaluator()或者自定义Evaluator。