属性动画插值器
参考资料:http://blog.csdn.net/guolin_blog/article/details/44171115
1、Interpolator简介
interpolator [ɪn'tɜ:pəʊleɪtə] 插值器主要控制动画的变化速率,Interpolator在Android1.0中就已经有了,在属性动画中新增了TimeInterpolator接口,这个接口用于兼容之前的interpolator
系统为我们实现了很多类,AccelerateInterpolator加速运动、DecelerateInterpolator减速运动、BouncelInterpolator模拟物理反弹效果。如果我们不设置插值器,系统默认AcceletateDecelerateInterpolator先加速后减速的Interpolator
2、TimeInterpolator接口
源码很简单,get一个input参数,这个参数会随动画不断变化,变化范围为0-1,动画开始为0结束为1
public interface TimeInterpolator {
float getInterpolation(float input);
}
input的值也决定了fraction的值,input由系统经过计算后传入到getInterpolation()方法中,然后我们自己实现算法,返回值就是fraction了
因此最简单的情况是input等于fraction,这种情况input匀速增加,fraction也匀速增加。系统内容的LinearInterpolator就是匀速运动的Interpolator,源码如下
/**
* An interpolator where the rate of change is constant
*/
@HasNativeInterpolator
public class LinearInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {
public LinearInterpolator() {
}
public LinearInterpolator(Context context, AttributeSet attrs) {
}
public float getInterpolation(float input) {
return input;
}
/** @hide */
@Override
public long createNativeInterpolator() {
return NativeInterpolatorFactoryHelper.createLinearInterpolator();
}
}
因为匀速运动,所以直接返回了input
3、AccelerateDecelerateInterpolator
现在分析先加速后减速的Interpolator,这个类是由系统实现的,源码如下
/**
* An interpolator where the rate of change starts and ends slowly but
* accelerates through the middle.
*
*/
@HasNativeInterpolator
public class AccelerateDecelerateInterpolator implements Interpolator, NativeInterpolatorFactory {
public AccelerateDecelerateInterpolator() {
}
@SuppressWarnings({"UnusedDeclaration"})
public AccelerateDecelerateInterpolator(Context context, AttributeSet attrs) {
}
public float getInterpolation(float input) {
return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;
}
/** @hide */
@Override
public long createNativeInterpolator() {
return NativeInterpolatorFactoryHelper.createAccelerateDecelerateInterpolator();
}
}
发现getInterpolation不再是直接返回input了,这里涉及到了数学运算,为了方便参考,将基本三角函数的对应关系列出如下


现在分析(float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f
input取值范围0~1,那么cos范围π~2π,cos运算结果范围-1~1
再除2加0.5
值区间0~1,但不再是均匀变化,在0~0.2和0.8~1变化幅度会变小,也就形成了先加速后减速
4、自定义Interpolator
DecelerateAccelerateInterpolator先减速后加速
public class DecelerateAccelerateInterpolator implements TimeInterpolator{
@Override
public float getInterpolation(float input) {
float result;
if (input <= 0.5) {
result = (float) (Math.sin(Math.PI * input)) / 2;
} else {
result = (float) (2 - Math.sin(Math.PI * input)) / 2;
}
return result;
}
}
动画中的使用
anim.setInterpolator(new DecelerateAccelerateInterpolator()); anim.setDuration(3000); anim.start();
5、ViewPropertyAnimator
Android3.1中对属性动画的一种简写,使用方便,如下写法对比
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "alpha", 0f);
animator.start();
textview.animate().alpha(0f);
textview.animate().x(500).y(500).setDuration(5000)
.setInterpolator(new BounceInterpolator());
浙公网安备 33010602011771号