属性动画插值器

参考资料: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());  

  

posted @ 2015-08-27 16:38  轻云沉峰  阅读(673)  评论(0)    收藏  举报