上一篇写了Android三种动画的使用,这里分析一下属性动画的两个属性插值器和估值器。
1、插值器
1.1 描述
TimeInterpolator、Interpolator、BaseInterpolator以及一些其他的XXInterpolator,一眼望去您认为谁是插值器的顶级父类,3、2、1,没错是TimeInterpolator,因此严格意义上来说他好像应该叫时间插值器。其实我的第一错觉Interpolator才是,下图可以看出来我真的错了。
时间插值器TimeInterpolator,根据时间消耗的百分比计算出当前属性改变的百分比,是以时间为维度的换算方式。
1.2 使用插值器
首先初始化一个插值器
TimeInterpolator mInterpolator = new BounceInterpolator();
然后调用Animator的setInterpolator方法
animSet.setInterpolator(getInterpolatorType(10));
齐活儿!
我上面用的animSet是AnimatorSet对象,因为属性动画Animator是个抽象类,有两个子类ValueAnimator、AnimatorSet,而TimeAnimator和ObjectAnimator是ValueAnimator的子类,我们一般都是在使用他们四个子孙类实现动画。
上面getInterpolatorType方法其实是封装了所有的时间插值器。
系统提供的时间插值器已基本够用,但也可以自定义。
/**
* 不同插值器
* @param type
* @return
*/
public TimeInterpolator getInterpolatorType(int type) {
switch (type) {
case 1:
mInterpolator = new BounceInterpolator();
break;
case 2:
mInterpolator = new AccelerateDecelerateInterpolator();
break;
case 3:
mInterpolator = new DecelerateInterpolator();
break;
case 4:
mInterpolator = new AnticipateInterpolator();
break;
case 5:
mInterpolator = new LinearInterpolator();
break;
case 6:
mInterpolator =new LinearOutSlowInInterpolator();
break;
case 7:
mInterpolator = new OvershootInterpolator();
case 8:
mInterpolator = new AccelerateInterpolator();
case 9:
mInterpolator = new AnticipateOvershootInterpolator();
case 10:
mInterpolator = new CycleInterpolator(1.0F);
default:
mInterpolator = new LinearInterpolator();
break;
}
return mInterpolator;
}
2、估值器
估值器用来根据当前属性改变的百分比来得出改变后的属性值
根TypeEvaluator接口 - 还有ArgbEvaluator 颜色估值器、 FloatEvaluator 浮点类型估值器、 FloatArrayEvaluator 浮点数组类型估值器、IntEvaluator整型类型估值器 、 IntArrayEvaluator 、 PointFEvaluator 、 ReactEvaluator,另外还有几个是在material包,比如MatrixEvaluator以及androidX.core包有几个是和androidjar里的是一样的比如也有ArgbEvaluator。
使用也是两步骤-以颜色估值器为例:
首先,使用ArgbEvaluator和自定义的色值初始化一个ObjectAnimator对象
animColor = ObjectAnimator.ofObject(this, "color", new ArgbEvaluator(), Color.GREEN,
Color.YELLOW, Color.BLUE, Color.WHITE, Color.RED);
然后设置时长和重复次数,并执行动画
animColor.setRepeatCount(-1);
animColor.setRepeatMode(ValueAnimator.REVERSE);
animColor.start();
不同于时间插值器,除了常用的颜色、浮点和整型估值器,关于运动轨迹的一般会自定义,因为需求各不相同。
3、使用范围
电影和端视屏都有了倍速和慢动作,现实中大多数动画也都是非匀速执行的。时间插值器和估值器就很擅长这个。
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//todo 这个值不断变动并通过postInvalidate触发onDraw引起重绘,point的值也是逐渐变化。
currentPoint=(Point) animation.getAnimatedValue();
//重绘
postInvalidate();
}
});
onAnimationUpdate回调可以监听动画执行的当前状态。开启动画的方法只执行一次但是onAnimationUpdate这个回调被调用postInvalidate();就会触发onDraw,在onDraw中继续绘制Animator。循环往复形成动画。