Android 动画 - 插值器

系列文章传送门:

Android 动画 - 帧动画 & 补间动画
Android 动画 - 插值器
Android 动画 - 属性动画


基本使用

在之前的文章中有提到,插值器定义了动画变化的速率

在 xml 中,使用 android:interpolator 来定义,而在类中的使用也很简单,new 一个对象设置进去就可以了

animation.setInterpolator(new AccelerateInterpolator());

那么这个插值器是怎么实现动画速率变化的呢,都有哪些插值器呢,总结一下。

简介

Interpolator 插值器定义了动画变化的速率,使得动画效果能够匀速、加速、减速的变化。

一个动画定义需要定义起始帧和结束帧,中间帧是由系统计算补齐的,如何做补齐计算就是由插值器完成的。

Interpolater 继承于 TimeInterpolator,而 TimeInterpolater是一个接口,里面只有一个方法 getInterpolation()

public interface TimeInterpolator {

    /**
     * Maps a value representing the elapsed fraction of an animation to a value that represents
     * the interpolated fraction. This interpolated value is then multiplied by the change in
     * value of an animation to derive the animated value at the current elapsed animation time.
     *
     * @param input A value between 0 and 1.0 indicating our current point
     *        in the animation where 0 represents the start and 1.0 represents
     *        the end
     * @return The interpolation value. This value can be more than 1.0 for
     *         interpolators which overshoot their targets, or less than 0 for
     *         interpolators that undershoot their targets.
     */
    float getInterpolation(float input);
}

这个插值器就像一个坐标转换的工具,将动画的值分布在时间轴上,getInterpolation() 的入参是个 0 ~ 1,对应着时间的索引,是坐标的 X 轴,返回的就是 X 轴上的时刻对应的动画插值,也就是 Y 轴。

Android 的 API 支持的插值器

插值器 效果
LinearInterpolator 线性插值器:匀速变化
AccelerateInterpolator 加速插值器:加速,先慢后快
DecelerateInterpolator 减速差值:减速,先快后慢
AccelerateDecelerateInterpolator 开始慢,然后加速,最后减速
AnticipateInterpolator 这个效果有点像射箭,往回拉一下,在加速射出去
OvershootInterpolator 这个效果和上面是相反的,就像从 A 跑到 B 跑过了 又回来了
AnticipateOvershootInterpolator 这个是前两个的结合,前面收了一下,结尾过了一下, 中间加速
BounceInterpolator 弹跳插值器:像一个自由落下的皮球,碰到了地面,弹几下
CycleInterpolator 周期插值器:以起始点为中心,数值加减变化

1. LinearInterpolator 线性插值器

  • 类名: LinearInterpolator
  • 资源ID: @android:anim/linear_interpolator
  • XML标记: linearInterpolator
  • 公式: y = t
  • 构造函数: public LinearInterpolator()
    linear

2. Accelerate Interpolator 加速插值器

  • 类名:AcceleraeInterpolator
  • 资源ID: @android:anim/accelerate_interpolator
  • XML标记:accelerateInterpolator
  • 公式: y = t^{2f}
  • 构造函数: public AccelerateInterpolator(float factor)
    • factor(android:factor)加速度参数,默认 1,f 越大,起始速度越慢,但是速度越来越快
accelerate

3. Decelerate Interpolator 减速插值

  • 类名: DecelerateInterpolator
  • 资源ID: @android:anim/decelerate_interpolator
  • XML标记: decelerateInterpolator
  • 公式::y=1-(1-t)^{2f}
  • 构造函数: public DecelerateInterpolator(float factor)
    • factor(android:factor)加速度参数,f 越大,起始速度越快,但是速度越来越慢
decelerate

4. Accelerate Decelerate Interpolator 先加速后减速

  • 类名: AccelerateDecelerateInterpolator
  • 资源ID:@android:anim/accelerate_decelerate_interpolator
  • XML 标记:accelerateDecelerateInterpolator
  • 公式:y=cos((t+1)π)/2 + 0.5
  • 构造函数:public AccelerateDecelerateInterpolator()
    accelerate_decelerate

5. Anticipate Interpolator

  • 类名: AnticipateInterpolator
  • 资源ID: @android:anim/anticipate_interpolator
  • XML标记: anticipateInterpolator
  • 公式: y=(T+1)t^3–Tt^2
  • 构造函数: public AnticipateInterpolator(float tension)
    • tension(android:tension) 张力值, 默认为2,T越大,初始的偏移越大,而且速度越快
anticipate

6. Overshoot Interpolator

  • 类名: OvershootInterpolator
  • 资源ID: @android:anim/overshoot_interpolator
  • XML标记: overshootInterpolator
  • 公式: y=(T+1)t^3+Tt^2 +1
  • 构造函数: public OvershootInterpolator (float tension)
    • tesion (android:tension) 张力值,默认为2,T越大,结束时的偏移越大,而且速度越快


      overshoot

7. Anticipate Overshoot Interpolator

  • 类名: AnticipateOvershootInterpolator

  • 资源ID: @android:anim/anticipate_overshoot_interpolator

  • XML标记: anticipateOvershootInterpolator

  • 公式:
    y = \begin{cases} 0.5((T+1)(2t)^3-T(2t)^2), & \text{t < 0.5} \\[2ex] 0.5((T+1)(2t-2)^3+T(2t-2)^2)+1, & \text{t ≥ 0.5} \end{cases}

  • 构造函数:

    • public AnticipateOvershootInterpolator(float tension)
    • public AnticipateOvershootInterpolator(float tension, float extraTension)
      • tension(android:tension) 张力值,默认为2,张力越大,起始和结束时的偏移越大,而且速度越快
      • extraTension(android:extraTension)额外张力值,默认为1.5。
      • 公式中 T 的值为 tension * extraTension
        anticipate_overshoot

8. Bounce Interpolator 弹跳插值器

  • 类名: BounceInterpolator
  • 资源ID: @android:anim/bounce_interpolator
  • XML标记:bounceInterpolator
  • 公式:
    y =\begin{cases} 8(1.226t)^2, & \text{t < 0.3535} \\[2ex] 8(1.226t-0.54719)^2 + 0.7, & \text{ 0.3535≤t<0.7408}\\[2ex] 8(1.226t-0.8526)^2 + 0.9, & \text{ 0.7408≤t<0.9644}\\[2ex] 8(1.226t-1.0435)^2 + 0.95, & \text{t ≥0.9644}\\[2ex] \end{cases}
  • 构造参数 public BounceInterpolator()
    bounce

9. Cycle Interpolator 周期插值器

  • 类名:CycleInterpolator
  • 资源ID:@android:anim/cycle_interpolator
  • XML标记:cycleInterpolator
  • 公式: y=sin(2π×c×t)
  • 构造参数 public CycleInterpolator(float cycles)
    • cycles (android:cycles) 周期值,默认为 1,标识执行的次数


      cycle

以上的插值器都是 API 自带的,可直接使用,如果是在 java /kotlin 类中使用,好像更明确,可以直接设置插值器的参数。xml 中也是可以的,只不过要先自定义一个 插值器的 xml,比如:

res/anim 创建一个 accelerate_interpolator_2.xml

<?xml version="1.0" encoding="utf-8"?>
<accelerateInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
    android:factor="2">
</accelerateInterpolator>

xml 使用时

android:interpolator="@anim/accelerate_interpolator_2" 

我们重写的这个加速插值器在代码中也是可以使用的

animation.setInterpolator(AnimationUtils.loadInterpolator(this,R.anim.accelerate_interpolator_2));

自定义插值器

前面提到的都是 Android 中配置好的可用的插值器,如果这些都无法满足设计效果的时候,也可以自定义插值器。只要继承 Interpolator 实现 getInterpolation() 即可

public class MyInterpolator implements Interpolator {
    public MyInterpolator() {}
    public float getInterpolation(float t) 
      return t * t * (3 - 2 * t);
    }
}

参考资料

Android Animations Tutorial 5: More on Interpolators
http://inloop.github.io/interpolator/ 特别好的工具,能够直观的看到各种插值器的效果

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271