上一篇文章主要介绍了自定义估值器的用法,达到可以对任意类的任意属性进行动画处理的目的。而其中都是使用的默认插值器AccelerateDecelerateInterpolator,就是先加速后减速插值器。接下来我们看看插值器。
差值器的关键方法
float getInterpolation(float input);
估值器的关键方法
public T evaluate(float fraction, T startValue, T endValue)
差值器中参数input经过一定的数学运算得到float类型的数值是动画的完成度也就是估值器里面evaluate方法中的参数fraction。
本篇文章是在上一篇的基础上,稍作改动从屏幕中间竖直向下移动。并将默认插值器替换为我们想要实验的插值器。
只需要改变ArgbAndPosView自定义View中的startAni。
如下
private void startAni() {
//起点属性值
Pointer startP = new Pointer(getWidth()/2,RADIUS,0xffff0000);
//终点属性值
Pointer endP = new Pointer(getWidth()/2,getHeight()-RADIUS,0xff00ff00);
//对本自定义View的pointer属性进行动画处理,动画时间为4000毫秒,从startP到endP,插值器用的默认的
ObjectAnimator ani = ObjectAnimator.ofObject(this,"pointer",new PointerEvaluator(),startP, endP);
//设置插值器:线性插值器
ani.setInterpolator(new LinearInterpolator());
ani.setDuration(4000);
ani.start();
}
只是将差值器更换掉
ani.setInterpolator(new AccelerateInterpolator());
从中我们也可以清楚的看到效果。其他的在这里就不全部展示了,下面我们看差值器到底是个什么东东。
前面的Android中动画之三属性动画高级用法一中我们对差值器有了初步了解,这里我们直接看一下系统自带差值器的源码,看看里面是怎么工作的。
public class LinearInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {
public LinearInterpolator() {
}
...省略代码...
//关键方法:传入什么就原值返回
public float getInterpolation(float input) {
return input;
}
...省略代码...
}
下面是其中的关键代码,注意看注释
public class AccelerateInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {
//两个关键参数,可以认为是整个动画中扮演“速度”角色。而差值器返回的数值代表“完成度”角色
private final float mFactor;
private final double mDoubleFactor;
//无参构造方法,默认设置两个属性值
public AccelerateInterpolator() {
mFactor = 1.0f;
mDoubleFactor = 2.0;
}
//有参构造,传入“速度值”
public AccelerateInterpolator(float factor) {
mFactor = factor;
mDoubleFactor = 2 * mFactor;
}
...省略代码...
//根据“速度值”决定完成度计算方式。
public float getInterpolation(float input) {
if (mFactor == 1.0f) {
return input * input;
} else {
return (float)Math.pow(input, mDoubleFactor);
}
}
...省略代码...
}
从上面我们看到只要getInterpolation中的算法自己定义,就能完成简单的差值器的定义。这里就不给出具体的算法,要根据具体业务需求来制定需要的算法。
属性动画针对的是任意类的任意属性,但是我们平时开发中主要操作的是View,如果只提供这些麻烦的api那么就显得不够人性化了。于是在3.1加入了ViewPropertyAnimator。
private void initView() {
showTv = (TextView) findViewById(R.id.show_tv);
//关键代码
showTv.animate().translationX(300).scaleX(2).setDuration(4000);
}
虽然使用这种方式可以实现和上面使用ValueAnimator和ObjectAnimator一样的效果,但是我更愿意使用上面的ValueAnimator和ObjectAnimator,更加灵活可扩展,当然这个看个人喜好。
Android中动画使用时候注意的问题。