Android动画--Interpolator的介绍

本文详细介绍了Interpolator在动画中的作用及其多种预设类型,包括加速、减速、循环等效果,并提供了自定义Interpolator的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Interpolator简介

Interpolator属性是Animation类的一个XML属性,所以alpha、scale、rotate、translate、set都会继承得到这个属性。它指定动画如何变化,跟PS里的动作有点类似:随便拿来一张图片,应用一个动作,图片就会指定变化。

被用来修饰动画效果,定义动画的变化率,可以使存在的动画效果accelerated(加速),decelerated(减速),repeated(重复),bounced(弹跳)等。

Interpolator属性

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

各种属性的效果如下:

  • AccelerateDecelerateInterpolator 动画从开始到结束,变化率是先加速后减速的过程。
  • AccelerateInterpolator 动画从开始到结束,变化率是一个加速的过程。
  • AnticipateInterpolator 开始的时候向后,然后向前甩
  • AnticipateOvershootInterpolator 开始的时候向后,然后向前甩一定值后返回最后的值
  • BounceInterpolator 动画结束的时候弹起
  • CycleInterpolator 动画从开始到结束,变化率是循环给定次数的正弦曲线。
  • DecelerateInterpolator 动画从开始到结束,变化率是一个减速的过程。
  • LinearInterpolator 以常量速率改变
  • OvershootInterpolator 向前甩一定值后再回到原来位置

Interpolator使用方法

在Java中(定义一个TextView tv):

LinearInterpolator li = new LinearInterpolator();
ObjectAnimator animator = ObjectAnimator.ofFloat(tv, "rotation", 0f, 360f);
animator.setInterpolator(li);
animator.setDuration(5000);
animator.start();

在xml中:

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator"
    />

当你没有为动画设置插值器是,系统默认会帮你设置加减速插值器AccelerateDecelerateInterpolator。

自定义Interpolator

既然要自定义Interpolator,我们自然要明白官方给我们的Interpolator是怎么实现的,我们就拿AccelerateDecelerateInterpolator和LinearInterpolator 作比较吧。

AccelerateDecelerateInterpolator的实现代码为:

@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();
    }
}

可以看出只重写了getInterpolation(float input)方法,所以加减速插值器的实现就在这个方法里。getInterpolation()方法接收一个input参数,input参数是系统根据设置的动画持续时间计算出来的,取值范围是[0,1],从0匀速增加到1。

(float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f

翻译成数学表达式就是:{0.5*cos[(input + 1)π] + 0.5}。

这里写图片描述

一个最基本的余弦函数变换,它的图像为[0,1]范围内的曲线,曲线的斜率先增大后减小,相应的,小球运动先加速后减速。

而线性插值器的实现代码为:

@HasNativeInterpolator
public class LinearInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {

    public LinearInterpolator() {
    }

    public LinearInterpolator(Context context, AttributeSet attrs) {
    }

    public float getInterpolation(float input) {
        return input;
    }

    /** @hide */
    @Override
    public long createNativeInterpolator() {
        return NativeInterpolatorFactoryHelper.createLinearInterpolator();
    }
}

LinearInterpolator的getInterpolation(float input)方法果然是直接把input参数作为返回值返回了。由于input参数是从0匀速增加到1的,所以自然就是匀速啦。

清楚Interpolator是怎么实现的,我们就可以自定义一个先减速后加速的DeceAcceInterpolator了:

public class DeceAcceInterpolator implements Interpolator {
    @Override
    public float getInterpolation(float input) {
        return ((4*input-2)*(4*input-2)*(4*input-2))/16f + 0.5f;
    }
}

翻译成数学表达式如下:[(4*input-2)^3]/16 + 0.5。

由图可知是先减速后加速。
然后把我们的DeceAcceInterpolator加到属性动画:

DeceAcceInterpolator di = new DeceAcceInterpolator();
ObjectAnimator animator = ObjectAnimator.ofFloat(mImageView, "rotation", 0f, 360f);
animator.setInterpolator(di);
animator.setDuration(5000);
animator.start();

可以看到笑脸确实是先做减速旋转,速度减为0后又继续加速旋转。

如此,我们简单的自定义Interpolator就完成了。

结束语:本文仅用来学习记录,参考查阅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值