• android 动画中插值器Interpolator详解


    1、插值器简介–Interpolator

    通俗易懂的说,Interpolator负责控制动画变化的速率,即确定了 动画效果变化的模式,使得基本的动画效果能够以匀速、加速、减速、抛物线速率等各种速率变化

    动画是开发者给定开始和结束的“关键帧”,其变化的“中间帧”是有系统计算决定然后播放出来。因此,动画的每一帧都将在开始和结束之间的特定时间显示。此时动画时间被转换为时间索引,则动画时间轴上的每个点都可以转换成0.0到1.0之间的一个浮点数。然后再将该值用于计算该对象的属性变换。在变换的情况下,y轴上,0.0对应于起始位置,1.0对应于结束位置,0.5对应于起始和结束之间的中间,对于一些插值器其值还可以是0~1之外的数值。

    ​​​​​​​​​​在这里插入图片描述
    从图中可以看见其实各种插值器都是实现了Interpolator接口而已,同时可以看见系统提供了许多已经实现OK的插值器,具体如下:

    java类xml id值描述
    AccelerateDecelerateInterpolator@android:anim/accelerate_decelerate_interpolator动画始末速率较慢,中间加速
    AccelerateInterpolator@android:anim/accelerate_interpolator动画开始速率较慢,之后慢慢加速
    AnticipateInterpolator@android:anim/anticipate_interpolator开始的时候从后向前甩
    AnticipateOvershootInterpolator@android:anim/anticipate_overshoot_interpolator类似上面AnticipateInterpolator
    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向前弹出一定值之后回到原来位置

    如上就是系统提供的一些插值器,下面我们来看看怎么使用他们。

    2、 插值器使用方法

    插值器的使用比较简答,如下:

    1. 在 动画效果的XML代码中设置插值器属性android:interpolator
    <set android:interpolator="@android:anim/accelerate_interpolator">
        ...
    </set>
    
    • 1
    • 2
    • 3
    1. 在 Java 代码中设置:
    		Button mButton = (Button) findViewById(R.id.Button);
            // 步骤1:创建 需要设置动画的 视图View
    
    		Animation alphaAnimation = new AlphaAnimation(1,0);
            // 步骤2:创建透明度动画的对象 & 设置动画效果
    
            alphaAnimation.setDuration(3000);
            Interpolator overshootInterpolator = new OvershootInterpolator();
            // 步骤3:创建对应的插值器类对象
    
            alphaAnimation.setInterpolator(overshootInterpolator);
            // 步骤4:给动画设置插值器
    
            mButton.startAnimation(alphaAnimation);
            // 步骤5:播放动画
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    3、 插值器的自定义

    有时候你会发现系统提供的插值器不够用,可能就像View一样需要自定义。所以接下来我们来看看插值器的自定义,关于插值器的自定义分为两种实现方式,xml自定义实现(其实就是对现有的插值器的一些属性修改)或者java代码实现方式。如下我们来说说。
    先看看XML自定义插值器的步骤:

    1. 在res/anim/目录下创建filename.xml文件
    2. 修改你准备自定义的插值器如下:
    <?xml version="1.0" encoding="utf-8"?>
    <InterpolatorName xmlns:android="http://schemas.android.com/apk/res/android"
        android:attribute_name="value"
        />
    
    • 1
    • 2
    • 3
    • 4
    1. 在你的补间动画文件中引用该文件即可

    再来看看Java自定义插值器的(Java自定义插值器其实是xml自定义的升级,也就是说如果我们修改xml的属性还不能满足需求,那就可以选择通过Java来实现)方式。

    可以看见上面所有的Interpolator都实现了Interpolator接口,而Interpolator接口又继承自TimeInterpolator,TimeInterpolator接口定义了一个float getInterpolation(float input);方法,这个方法是由系统调用的,其中的参数input代表动画的时间,在0和1之间,也就是开始和结束之间。

    如下就是一个动画始末速率较慢、中间加速的AccelerateDecelerateInterpolator插值器:

    public class AccelerateDecelerateInterpolator extends BaseInterpolator
            implements NativeInterpolatorFactory {
        ......
        public float getInterpolation(float input) {
            return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;
        }
        ......
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    到此插值器都分析完毕

    插值器相关参数介绍参考Android:插值器(Interpolator)和估值器(TypeEvaluator)的理解和使用

  • 相关阅读:
    生成式模型和判别式模型
    python之函数的基本用法
    c语言-浅谈指针(3)
    elasticsearch索引同步
    OSPF,RIP和BGP的路由汇总
    接口测试复习
    运行huggingface Kosmos2报错 nameerror: name ‘kosmos2tokenizer‘ is not defined
    【云原生 | 从零开始学Kubernetes】十三、k8s的容器探测以及启动探测
    LSTM情感分类问题调试
    LeetCode刷题(python版)——Topic58最后一个单词的长度
  • 原文地址:https://blog.csdn.net/muranfei/article/details/125521420