02.3 精通自定义 View 之视图动画——插值器初探

返回自定义 View 目录

2.3.0 概述

有关动画的变化速率的问题是由 Interpolator 类来决定的。Interpolator 叫插值器,也叫加速器,是用来指定动画如何变化的变量。它只是一个接口,通过实现这个接口就可以自定义动画的变化速率。系统提供了如下几个实现了插值器的类:

Interpolator class Resource ID
AccelerateDecelerateInterpolator @android:anim/accelerate_decelerate_interpolator
AccelerateInterpolator @android:anim/accelerate_interpolator
DecelerateInterpolator @android:anim/decelerate_interpolator
LinearInterpolator @android:anim/linear_interpolator
BounceInterpolator @android:anim/bounce_interpolator
AnticipateInterpolator @android:anim/anticipate_interpolator
OvershootInterpolator @android:anim/overshoot_interpolator
AnticipateOvershootInterpolator @android:anim/anticipate_overshoot_interpolator
CycleInterpolator @android:anim/cycle_interpolator

关于插值器,有两种使用方法。

方法一、XML 引用

1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="1.0"
android:toAlpha="0.1"
android:duration="3000"
android:interpolator="@android:anim/accelerate_interpolator"/>

方法二、setInterpolator()

1
2
3
AlphaAnimation alphaAnim = new AlphaAnimation(1.0f, 0.1f);
alphaAnim.setDuration(3000);
alphaAnim.setInterpolator(new LinearInterpolator());

2.3.1 AccelerateDecelerateInterpolator

加速减速插值器,表示在开始与结束的地方速率改变比较慢,在中间的时候加速。

1
2
3
4
5
6
7
TranslateAnimation alphaAnim = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_PARENT, 0.5f,
Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_PARENT, 0.5f);
alphaAnim.setDuration(2000);
alphaAnim.setFillAfter(true);
alphaAnim.setInterpolator(new AccelerateDecelerateInterpolator());
view.startAnimation(alphaAnim);

2.3.2 AccelerateInterpolator

加速插值器,表示在动画开始的地方速率比较慢,然后开始加速。

1
alphaAnim.setInterpolator(new AccelerateInterpolator());

2.3.3 DecelerateInterpolator

减速插值器,表示在动画开始的一瞬间加速到最大值,然后逐渐变慢。

1
alphaAnim.setInterpolator(new DecelerateInterpolator());

2.3.4 LinearInterpolator

线性插值器,也称匀速插值器,显然,它的速率是保持恒定的。

1
alphaAnim.setInterpolator(new LinearInterpolator());

2.3.5 BounceInterpolator

弹跳插值器,模拟了控件自由落地后回弹的效果。

1
alphaAnim.setInterpolator(new BounceInterpolator());

2.3.6 AnticipateInterpolator

初始偏移插值器,表示在动画开始的时候向前偏移一段距离,然后应用动画。

1
2
public AnticipateInterpolator()
public AnticipateInterpolator(float tension)

参数 float tension 对应的 XML 属性为 android:tension,表示张力值,默认值为 2。值越大,初始的偏移量越大,而且速度越快。0 表示不偏移。

示例:

1
alphaAnim.setInterpolator(new AnticipateInterpolator(4));

2.3.7 OvershootInterpolator

结束偏移插值器,表示在动画结束的时候沿动画方向继续运动一段距离后再结束动画。

1
2
public OvershootInterpolator()
public OvershootInterpolator(float tension)

参数 float tension 对应的 XML 属性为 android:tension,表示张力值,默认值为 2。值越大,结束时的偏移量越大。0 表示不偏移。

1
alphaAnim.setInterpolator(new OvershootInterpolator());

2.3.8 AnticipateOvershootInterpolator

是 AnticipateInterpolator 和 OvershootInterpolator 的合体,即在动画开始时向前偏移一段距离后,在动画结束的时候沿动画方向继续运动一段距离后再结束动画。

1
2
3
public AnticipateOvershootInterpolator()
public AnticipateOvershootInterpolator(float tension)
public AnticipateOvershootInterpolator(float tension, float extraTension)

  • 参数 float tension 对应的 XML 属性为 android:tension,表示张力值,默认值为 2。值越大,初始和结束的偏移量越大。0 表示不偏移。
  • 参数 float extraTension 对应的 XML 属性为 android:extraTension,表示额外张力值,默认值为 1.5。
1
alphaAnim.setInterpolator(new AnticipateOvershootInterpolator());

2.3.9 CycleInterpolator

循环插值器,表示动画循环播放特定的次数,速率沿正弦曲线改变。

1
2
3
4
5
6
TranslateAnimation alphaAnim = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_PARENT, 0.5f,
Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_PARENT, 0.5f);
alphaAnim.setDuration(2000);
alphaAnim.setFillAfter(true);
alphaAnim.setInterpolator(new CycleInterpolator());

虽然设置了 setFillAfter(true),但对于 CycleInterpolator 而言并没有什么影响,动画结束后,视图还原到初始位置。