高级UIAndroid UI绘制

Android 动画 - 插值器

2020-08-17  本文已影响0人  tingtingtina

系列文章传送门:

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 线性插值器

2. Accelerate Interpolator 加速插值器

accelerate

3. Decelerate Interpolator 减速插值

decelerate

4. Accelerate Decelerate Interpolator 先加速后减速

5. Anticipate Interpolator

anticipate

6. Overshoot Interpolator

  1. Anticipate Overshoot Interpolator

8. Bounce Interpolator 弹跳插值器

9. Cycle Interpolator 周期插值器

以上的插值器都是 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/ 特别好的工具,能够直观的看到各种插值器的效果

上一篇下一篇

猜你喜欢

热点阅读