111 篇文章 1 订阅

# 介绍

Interpolator 本质上是一个数学函数，其取数字在0.0和1.0之间，并将其转换为另一个数字。

# 原理

1. public interface TimeInterpolator {

2. /**

3. * Maps a value representing the elapsed fraction of an animation to a value that represents

4. * the interpolated fraction. This interpolated value is then multiplied by the change in

5. * value of an animation to derive the animated value at the current elapsed animation time.

6. *

7. * @param input A value between 0 and 1.0 indicating our current point

8. * in the animation where 0 represents the start and 1.0 represents

9. * the end

10. * @return The interpolation value. This value can be more than 1.0 for

11. * interpolators which overshoot their targets, or less than 0 for

12. * interpolators that undershoot their targets.

13. */

14. float getInterpolation(float input);

15. }


1. @HasNativeInterpolator

2. public class AccelerateInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {

3. private final float mFactor;

4. private final double mDoubleFactor;

5.
6. public AccelerateInterpolator() {

7. mFactor = 1.0f;

8. mDoubleFactor = 2.0;

9. }

10.
11. /**

12. * Constructor

13. */

14. public AccelerateInterpolator(float factor) {

15. mFactor = factor;

16. mDoubleFactor = 2 * mFactor;

17. }

18.
19. public AccelerateInterpolator(Context context, AttributeSet attrs) {

20. this(context.getResources(), context.getTheme(), attrs);

21. }

22.
23. public float getInterpolation(float t) {

24. if (mFactor == 1.0f) {

25. return t * t;

26. } else {

27. return (float)Math.pow(t, mDoubleFactor);

28. }

29. }

30. }

y=t2f

t：就是时间索引，通过比例的转换为0-1之间的值，即3000m或者5000ms，在运动随着时间的流逝，通过比例都转换为0-1的取值；

y：就是Interpolator的输出，根据时间的流逝的百分比，计算出动画属性改变的百分比，或者是说动画总路程的百分比。

f ：相当于代码中的mFactor，指定加速度应该如何强调的因素 ，可以通过构造函数自定义该值，这里默认是1。这里的 f 越大，起始速度越慢，但是后期加速度会更大；如果 f=0.5，则和LinearInterpolator的行为一模一样了。

# 分类

java类xml资源id说明
AccelerateDecelerateInterpolator@android:anim/accelerate_decelerate_interpolator其变化开始和结束速率较慢，中间加速
AccelerateInterpolator@android:anim/accelerate_interpolator其变化开始速率较慢，后面加速
DecelerateInterpolator@android:anim/decelerate_interpolator其变化开始速率较快，后面减速
LinearInterpolator@android:anim/linear_interpolator其变化速率恒定
AnticipateInterpolator@android:anim/anticipate_interpolator其变化开始向后甩，然后向前
AnticipateOvershootInterpolator@android:anim/anticipate_overshoot_interpolator其变化开始向后甩，然后向前甩，过冲到目标值，最后又回到了终值
OvershootInterpolator@android:anim/overshoot_interpolator其变化开始向前甩，过冲到目标值，最后又回到了终值
BounceInterpolator@android:anim/bounce_interpolator其变化在结束时反弹
CycleInterpolator@android:anim/cycle_interpolator循环播放，其速率为正弦曲线
TimeInterpolator 一个接口，可以自定义插值器

## 1.Linear Interpolator 线性插值

## 2. Accelerate Interpolator / 加速度插值器

名称: f

XML属性: android:factor

描述: 加速度参数. f越大，起始速度越慢，但是速度越来越快

## 3. Decelerate Interpolator / 减速插值器

名称: f

XML属性: android:factor

描述: 加速度参数.  f越大，起始速度越快，但是速度越来越慢

## 4. Accelerate Decelerate Interpolator / 先加速后减速插值器

## 5. Anticipate Interpolator

名称: T

XML属性: android:tension

描述: 张力值, 默认为2，T越大，初始的偏移越大，而且速度越快

## 6. Overshoot Interpolator

名称: T

XML属性: android:tension

描述: 张力值，默认为2，T越大，结束时的偏移越大，而且速度越快

该插值器的y值就是先会超过1，然后又回到1。

## 7.Anticipate Overshoot Interpolator

public AnticipateOvershootInterpolator(float tension)

public AnticipateOvershootInterpolator(float tension, float extraTension)

XML属性: android:tension

描述: 张力值，默认为2，张力越大，起始和结束时的偏移越大，而且速度越快

XML属性: android:extraTension

描述: 额外张力值，默认为1.5。

公式中T的值为tension*extraTension

## 8. Bounce Interpolator / 弹跳插值器

## 9.Cycle Interpolator / 周期插值器

名称: C

XML属性: android:cycles

描述: 周期值，默认为1；2表示动画会执行两次

这里的动画是放大效果，那么就会先放大->缩小 -> 放大 ->恢复原来

# 使用

## 在xml使用


1. <scale

2. android:duration="2000"

3. android:fromXScale="1.0"

4. android:fromYScale="1.0"

5. android:interpolator="@android:anim/accelerate_interpolator"

6. android:pivotX="50%"

7. android:pivotY="50%"

8. android:toXScale="0"

9. android:toYScale="0"/>


1. <?xml version="1.0" encoding="utf-8"?>

2. <accelerateInterpolator xmlns:android="http://schemas.android.com/apk/res/android"

3. android:factor="2">

4. </accelerateInterpolator>

## 在java是使用

animation.setInterpolator(new AccelerateInterpolator());

animation.setInterpolator(new AccelerateInterpolator(2));

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

# 自定义Interpolators


1. public class HesitateInterpolator implements Interpolator {

2.
3. public HesitateInterpolator() {}

4.
5. @Override

6. public float getInterpolation(float input) {

7. float x = 2.0f * input - 1.0f;

8. return 0.5f * (x * x * x + 1.0f);

9. }

10. }

java类说明
FastOutLinearInInterpolator其变化先加速然后匀速，本质还是加速运动，和Accelerate  Interpolator类似
LinearOutSlowInInterpolator其变化先匀速再减速，和Decelerate Interpolator类似
FastOutSlowInInterpolator其变化是先加速，然后减速，和Accelerate Decelerate Interpolator类似

http://cogitolearning.co.uk/?p=1078

• 0
点赞
• 2
收藏
• 0
评论
11-21 229
11-17 10万+
03-05 632
06-29 1423
03-11 367
12-30 593
09-29 1312
09-21 2万+
06-20 3118
06-20 918
11-24 3583
05-22 257
03-27 1361

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

©️2022 CSDN 皮肤主题：Age of Ai 设计师：meimeiellie

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、C币套餐、付费专栏及课程。