Interpolator插值器

介绍

根据官方文档的描述:

An interpolator defines the rate of change of an animation. This allows the basic animation effects (alpha, scale, translate, rotate) to be accelerated, decelerated, repeated, etc.
一个插值器定义了动画改变的速率,它允许影响基本动画的加速、减速和重复等。

因此插值器是用来控制动画执行速率的工具,Android系统给我们提供了许多内置的插值器,一般情况下我们使用系统提供的就够了。

系统内置Interpolator

  • AccelerateDecelerateInterpolator
    在动画开始与介绍的地方速率改变比较慢,在中间的时候加速
  • AccelerateInterpolator
    在动画开始的地方速率改变比较慢,然后开始加速
  • AnticipateInterpolator
    开始的时候向后然后向前甩
  • AnticipateOvershootInterpolator
    开始的时候向后然后向前甩一定值后返回最后的值
  • BounceInterpolator
    动画结束的时候弹起
  • CycleInterpolator
    动画循环播放特定的次数,速率改变沿着正弦曲线
  • DecelerateInterpolator
    在动画开始的地方快然后慢
  • LinearInterpolator
    以常量速率改变
  • OvershootInterpolator
    向前甩一定值后再回到原来位置
  • .............etc.

使用方法

  • XML 通过@android:anim/xx_interpolator引用。
<?xml version="1.0" encoding="utf-8"?>  
<scale xmlns:android="http://schemas.android.com/apk/res/android"  
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
    android:fromXScale="0.0"  
    android:toXScale="1.4"  
    android:fromYScale="0.0"  
    android:toYScale="1.4"  
    android:pivotX="50%"  
    android:pivotY="50%"  
    android:duration="700"   
    android:fillAfter="true"  
/>  
  • 代码
mScaleAnim.setInterpolator(new BounceInterpolator());  

默认插值器

默认情况下,每个Animation或Animator都有一个默认的插值器,它就是AccelerateDecelerateInterpolator。

从代码里可以看出

Animation.java

    /**
     * Gurantees that this animation has an interpolator. Will use
     * a AccelerateDecelerateInterpolator is nothing else was specified.
     */
    protected void ensureInterpolator() {
        if (mInterpolator == null) {
            mInterpolator = new AccelerateDecelerateInterpolator();
        }
    }

ValueAnnimator.java

private static final TimeInterpolator sDefaultInterpolator =  
            new AccelerateDecelerateInterpolator();

这里我们看看AccelerateDecelerateInterpolator的实现:

AccelerateDecelerateInterpolator.java

/**
 * An interpolator where the rate of change starts and ends slowly but
 * accelerates through the middle.
 */
@HasNativeInterpolator
public class AccelerateDecelerateInterpolator extends BaseInterpolator  
        implements 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();
    }
}

这里面主要看看public float getInterpolation(float input)方法。

参数input: input参数是一个float类型,它取值范围是0到1,表示当前动画的进度,取0时表示动画刚开始,取1时表示动画结束,取0.5时表示动画中间的位置,其它类推。
返回值: 表示当前实际想要显示的进度。取值可以超过1也可以小于0,超过1表示已经超过目标值,小于0表示小于开始位置。

插值器就是通过改变这个input的数值来控制动画的进度,上面AccelerateDecelerateInterpolator就是通过Math.cos函数来实现一个加速的过程。

自定义插值器

自定义Interpolator只需要继承Interpolator类,并重写 float getInterpolation(float input);这里我们可以使用数学函数定义各种效果了。

/**
 * 自定义正弦插值器
 * Created by Administrator on 2017/4/19.
 */
public class SinInterpolator implements Interpolator {

    @Override
    public float getInterpolation(float input) {
        return (float) Math.sin((input / 2) * Math.PI);
    }
}

结束

Interpolator的基本用法就这些,一般情况下,系统提供的插值器够我们日常开发使用了,我们可以通过它们实现各种酷炫的效果。

Deomo 地址:gitHub

参考 Android开发文档-Interpolator