关于Android动画插值器的简单介绍以及如何自定义自己的插值器

2024-05-28 17:48

本文主要是介绍关于Android动画插值器的简单介绍以及如何自定义自己的插值器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本篇博客介绍如何使用Android动画的差值,以及如何自定义自己的插值器。在Android中既可以通过在xml中为相应的动画设置插值器也可以通过java代码设置动画插值器,在android动画中,如果没有为动画指定插值器,则系统会默认设置为加速度插值器,具体的可以看一下代码上的实现。Android系统一共提供了9种差值器。下面我们来挨个看一下:
1、AccelerateDecelerateInterpolator :在动画开始与结束的地方速率改变比较慢,在中间的时候加速
效果如下:
这里写图片描述

gif现实的效果不是很明显,有兴趣的可以自己试一下,下面来看一下代码的具体实现。
AccelerateDecelerateInterpolator .java

    public float getInterpolation(float input) {return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;}

这里的input指的是动画的进度,取值范围为0~1.而这里的返回值会在具体的动画中使用到,这里就以ScaleAnimation讲解一下,在ScaleAniamtion中的applyTransformation方法会对插值器的返回值进行处理,并最终确定Scale的值,还是看一下方法吧:

    protected void applyTransformation(float interpolatedTime, Transformation t) {float sx = 1.0f;float sy = 1.0f;float scale = getScaleFactor();if (mFromX != 1.0f || mToX != 1.0f) {sx = mFromX + ((mToX - mFromX) * interpolatedTime);}if (mFromY != 1.0f || mToY != 1.0f) {sy = mFromY + ((mToY - mFromY) * interpolatedTime);}if (mPivotX == 0 && mPivotY == 0) {t.getMatrix().setScale(sx, sy);} else {t.getMatrix().setScale(sx, sy, scale * mPivotX, scale * mPivotY);}}

每一个Animation对插值器的返回处理都不太一样,但是目标都是相同,即根据差值器的返回值确定当前view的状态。具体的看一下上面的代码就知道了,在这里就不解释了!!!

2、AccelerateInterpolator:在动画开始的地方速率改变比较慢,然后开始速率变化加快
效果图如下:
这里写图片描述
具体的实现代码:

AccelerateInterpolatorpublic float getInterpolation(float input) {if (mFactor == 1.0f) {return input * input;} else {return (float)Math.pow(input, mDoubleFactor);}}

Math.pow(x,y)的执行结果为x的y幂次。如果在代码中使用无参构造方法,mDoubleFactor的默认值是2.0,mDoubleFactor跟构造方法中传入的参数有关,具体的代码如下:

    public AccelerateInterpolator(float factor) {mFactor = factor;mDoubleFactor = 2 * mFactor;}

3、LinearInterpolator:以常量速率改变

效果图如下所示:

这里写图片描述

在这个插值器中,直接返回动画的执行进度,也就是input。

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

4、AnticipateInterpolator:开始的时候向后然后向前甩

效果图如下所示:
这里写图片描述

具体实现代码:

    public float getInterpolation(float t) {// a(t) = t * t * ((tension + 1) * t - tension)return t * t * ((mTension + 1) * t - mTension);}

如果在代码中实例化并采用无参构造方法,mTension的默认值为2。代码如下:

    public AnticipateInterpolator() {mTension = 2.0f;}/*** @param tension Amount of anticipation. When tension equals 0.0f, there is*                no anticipation and the interpolator becomes a simple*                acceleration interpolator.*/public AnticipateInterpolator(float tension) {mTension = tension;}

在这里就不解释了,也没什么好解释的!!代码一目了然
5、CycleInterpolator:动画循环播放特定的次数,速率改变沿着正弦曲线,使用这个插值器可能会让UI发生翻转,还是先看一下效果图吧,更加明显:
效果图如下图所示:
这里写图片描述

插值器实现的代码:

    public float getInterpolation(float input) {return (float)(Math.sin(2 * mCycles * Math.PI * input));}

根据上述给出的ScaleAnimation中的就算方法,如果插值器返回的负值太小,可能会是scale值为负值,有兴趣的朋友可以自己试一下!!!
其中mCycles参数的值与构造方法有关:

    public CycleInterpolator(float cycles) {mCycles = cycles;}

计算的时候,直接带入计算即可,在这里就不多说了!!!

6、anticipateOvershootInterpolator:开始的时候向后然后向前甩一定值后返回最后的值

具体的效果不好描述,直接看效果图吧:
效果图如下所示:

插值器的实现代码:

    public float getInterpolation(float t) {// a(t, s) = t * t * ((s + 1) * t - s)// o(t, s) = t * t * ((s + 1) * t + s)// f(t) = 0

这篇关于关于Android动画插值器的简单介绍以及如何自定义自己的插值器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1011266

相关文章

揭秘未来艺术:AI绘画工具全面介绍

📑前言 随着科技的飞速发展,人工智能(AI)已经逐渐渗透到我们生活的方方面面。在艺术创作领域,AI技术同样展现出了其独特的魅力。今天,我们就来一起探索这个神秘而引人入胜的领域,深入了解AI绘画工具的奥秘及其为艺术创作带来的革命性变革。 一、AI绘画工具的崛起 1.1 颠覆传统绘画模式 在过去,绘画是艺术家们通过手中的画笔,蘸取颜料,在画布上自由挥洒的创造性过程。然而,随着AI绘画工

一份LLM资源清单围观技术大佬的日常;手把手教你在美国搭建「百万卡」AI数据中心;为啥大模型做不好简单的数学计算? | ShowMeAI日报

👀日报&周刊合集 | 🎡ShowMeAI官网 | 🧡 点赞关注评论拜托啦! 1. 为啥大模型做不好简单的数学计算?从大模型高考数学成绩不及格说起 司南评测体系 OpenCompass 选取 7 个大模型 (6 个开源模型+ GPT-4o),组织参与了 2024 年高考「新课标I卷」的语文、数学、英语考试,然后由经验丰富的判卷老师评判得分。 结果如上图所

20.Spring5注解介绍

1.配置组件 Configure Components 注解名称说明@Configuration把一个类作为一个loC容 器 ,它的某个方法头上如果注册7@Bean , 就会作为这个Spring容器中的Bean@ComponentScan在配置类上添加@ComponentScan注解。该注解默认会扫描该类所在的包下所有的配置类,相当于之前的 <context:component-scan>@Sc

ROS话题通信流程自定义数据格式

ROS话题通信流程自定义数据格式 需求流程实现步骤定义msg文件编辑配置文件编译 在 ROS 通信协议中,数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty… 但是,这些数据一般只包含一个 data 字段,结构的单一意味着功能上的局限性,当传输一些复杂的数据,比如:

Eclipse+ADT与Android Studio开发的区别

下文的EA指Eclipse+ADT,AS就是指Android Studio。 就编写界面布局来说AS可以边开发边预览(所见即所得,以及多个屏幕预览),这个优势比较大。AS运行时占的内存比EA的要小。AS创建项目时要创建gradle项目框架,so,创建项目时AS比较慢。android studio基于gradle构建项目,你无法同时集中管理和维护多个项目的源码,而eclipse ADT可以同时打开

android 免费短信验证功能

没有太复杂的使用的话,功能实现比较简单粗暴。 在www.mob.com网站中可以申请使用免费短信验证功能。 步骤: 1.注册登录。 2.选择“短信验证码SDK” 3.下载对应的sdk包,我这是选studio的。 4.从头像那进入后台并创建短信验证应用,获取到key跟secret 5.根据技术文档操作(initSDK方法写在setContentView上面) 6.关键:在有用到的Mo

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现

Android我的二维码扫描功能发展史(完整)

最近在研究下二维码扫描功能,跟据从网上查阅的资料到自己勉强已实现扫描功能来一一介绍我的二维码扫描功能实现的发展历程: 首页通过网络搜索发现做android二维码扫描功能看去都是基于google的ZXing项目开发。 2、搜索怎么使用ZXing实现自己的二维码扫描:从网上下载ZXing-2.2.zip以及core-2.2-source.jar文件,分别解压两个文件。然后把.jar解压出来的整个c

android 带与不带logo的二维码生成

该代码基于ZXing项目,这个网上能下载得到。 定义的控件以及属性: public static final int SCAN_CODE = 1;private ImageView iv;private EditText et;private Button qr_btn,add_logo;private Bitmap logo,bitmap,bmp; //logo图标private st

回调的简单理解

之前一直不太明白回调的用法,现在简单的理解下 就按这张slidingmenu来说,主界面为Activity界面,而旁边的菜单为fragment界面。1.现在通过主界面的slidingmenu按钮来点开旁边的菜单功能并且选中”区县“选项(到这里就可以理解为A类调用B类里面的c方法)。2.通过触发“区县”的选项使得主界面跳转到“区县”相关的新闻列表界面中(到这里就可以理解为B类调用A类中的d方法