nterpolator这个东西很难进行翻译,直译过来的话是补间器的意思,它的主要作用是可以控制动画的变化速率,比如去实现一种非线性运动的动画效果。那么什么叫做非线性运动的动画效果呢?就是说动画改变的速率不是一成不变的,像加速运动以及减速运动都属于非线性运动。

不过Interpolator并不是属性动画中新增的技术,实际上从Android 1.0版本开始就一直存在Interpolator接口了,而之前的补间动画当然也是支持这个功能的。只不过在属性动画中新增了一个TimeInterpolator接口,这个接口是用于兼容之前的Interpolator的,这使得所有过去的Interpolator实现类都可以直接拿过来放到属性动画当中使用,那么我们来看一下现在TimeInterpolator接口的所有实现类,如下图所示:

可以看到,TimeInterpolator接口已经有非常多的实现类了,这些都是Android系统内置好的并且我们可以直接使用的Interpolator。每个Interpolator都有它各自的实现效果,比如说AccelerateInterpolator就是一个加速运动的Interpolator,而DecelerateInterpolator就是一个减速运动的Interpolator。

我觉得细心的朋友应该早已经发现了,在前面两篇文章当中我们所学到的所有属性动画,其实都不是在进行一种线程运动。比如说在“上”篇文章中使用ValueAnimator所打印的值如下所示:

可以看到,一开始的值变化速度明显比较慢,仅0.0开头的就打印了4次,之后开始加速,最后阶段又开始减速,因此我们可以很明显地看出这一个先加速后减速的Interpolator。

编写自定义Interpolator最主要的难度都是在于数学计算方面的,由于我数学并不是很好,因此这里也就写一个简单点的Interpolator来给大家演示一下。既然属性动画默认的Interpolator是先加速后减速的一种方式,这里我们就对它进行一个简单的修改,让它变成先减速后加速的方式。新建DecelerateAccelerateInterpolator类,让它实现TimeInterpolator接口,代码如下所示:

[java] view plaincopy
  1. public class DecelerateAccelerateInterpolator implements TimeInterpolator{
  2. @Override
  3. public float getInterpolation(float input) {
  4. float result;
  5. if (input <= 0.5) {
  6. result = (float) (Math.sin(Math.PI * input)) / 2;
  7. } else {
  8. result = (float) (2 - Math.sin(Math.PI * input)) / 2;
  9. }
  10. return result;
  11. }
  12. }

这段代码是使用正弦函数来实现先减速后加速的功能的,因为正弦函数初始弧度的变化值非常大,刚好和余弦函数是相反的,而随着弧度的增加,正弦函数的变化值也会逐渐变小,这样也就实现了减速的效果。当弧度大于π/2之后,整个过程相反了过来,现在正弦函数的弧度变化值非常小,渐渐随着弧度继续增加,变化值越来越大,弧度到π时结束,这样从0过度到π,也就实现了先减速后加速的效果。

同样我们可以将这个算法的执行情况通过曲线图的方式绘制出来,结果如下图所示:

可以看到,这也是一个S型的曲线图,只不过曲线的方向和刚才是相反的。从上图中我们可以很清楚地看出来,一开始纵坐标的变化幅度很大,然后逐渐变小,横坐标到0.5的时候纵坐标变化幅度趋近于零,之后随着横坐标继续增加纵坐标的变化幅度又开始变大,的确是先减速后加速的效果。

那么现在我们将DecelerateAccelerateInterpolator在代码中进行替换,如下所示:

[java] view plaincopy
  1. private void startAnimation() {
  2. Point startPoint = new Point(getWidth() / 2, RADIUS);
  3. Point endPoint = new Point(getWidth() / 2, getHeight() - RADIUS);
  4. ValueAnimator anim = ValueAnimator.ofObject(new PointEvaluator(), startPoint, endPoint);
  5. anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
  6. @Override
  7. public void onAnimationUpdate(ValueAnimator animation) {
  8. currentPoint = (Point) animation.getAnimatedValue();
  9. invalidate();
  10. }
  11. });
  12. anim.setInterpolator(new DecelerateAccelerateInterpolator());
  13. anim.setDuration(3000);
  14. anim.start();
  15. }

非常简单,就是将DecelerateAccelerateInterpolator的实例传入到setInterpolator()方法当中。重新运行一下代码,效果如下图所示:

OK!小球的运动确实是先减速后加速的效果,说明我们自定义的Interpolator已经可以正常工作了。通过这样一个程度的学习,相信大家对属性动画Interpolator的理解和使用都达到了一个比较深刻的层次了。

自定义Interpolator相关推荐

  1. Android属性动画 Interpolator

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/118683683 本文出自[赵彦军的博客] 文章目录 Interpolator Ti ...

  2. 属性动画Android动画,Android动画(三)属性动画Animator与Interpolator

    概述 继上一篇,Android中的视图动画和帧动画可以实现大部分的Android中的动画需求,但是有一个缺点,就是其事件响应区域并没有发生变化,这时候出现了属性动画完全弥补了这个缺点 属性动画结构 可 ...

  3. 第四章 自定义组件、动画

    文章目录 第四章 自定义组件.动画 (一)View体系 (1)View简介 (2)Android坐标系 (3)视图坐标系 (二)自定义View (1)onMeasure:对当前View的尺寸进行测量 ...

  4. Android 动画之View动画效果和Activity切换动画效果

    View动画效果: 1.>>Tween动画 通过对View的内容进行一系列的图形变换(平移.缩放.旋转.透明度变换)实现动画效果,补间动画需要使用<set>节点作为根节点,子节 ...

  5. Android开发之三种动画

    转载:http://www.cnblogs.com/angeldevil/archive/2011/12/02/2271096.html http://www.lightskystreet.com/2 ...

  6. 动画代码Android动画学习笔记动画代码

    间时紧张,先记一笔,后续优化与完善. 3.0之前,android支撑两种动画模式,tween animation,frame animation,在android3.0中又引入了一个新的动画统系:pr ...

  7. android Animator详解

    3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中又引入了一个新的动画系统:property animation,这三 ...

  8. Android Property Animation动画

    3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中又引入了一个新的动画系统:property animation,这三 ...

  9. android动画详解

    转自:工匠若水 http://blog.csdn.net/yanbober 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让全面说说Android的动画,所以今天来一发A ...

最新文章

  1. [JAVA EE] 拦截器
  2. vim 之中 U 命令的浅析
  3. 去除某些网站 复制粘贴尾巴
  4. php jquery grid,jQuery Grid
  5. “让Keras更酷一些!”:层与模型的重用技巧
  6. c++ map初始化_Go学习每日一问(18)-map元素查找
  7. WORD如何设置第X页,共Y页页码设置?
  8. Excel关于宏的运用
  9. 没有学历文凭,如何成为一名优秀的 Java 程序员?
  10. PMP 与IPMP区别是什么?
  11. 牛客多校第九场H Cutting Bamboos(主席树 区间比k小的个数)题解
  12. centos7 vsftpd默认端口修改
  13. 找出不是两个数组共有的元素_[数组] N数之和问题
  14. springboot中得注解_SpringBoot 中的基本注解
  15. 数字证书相关的知识点
  16. (转贴)联想员工亲历联想大裁员:公司不是家
  17. Excel二次开发学习笔记——获取某列最后一个非空单元格的行号
  18. OkHttp3使用介绍
  19. C语言中简单冒泡排序不花里胡哨
  20. 一般程序员正常会会几种语言?

热门文章

  1. lacp可以在access接口吗_【基础】防火墙接口类型全介绍
  2. git 如何清理操作日志_git如何清空所有的commit记录
  3. 光流 | 基于KLT(Kanade-Lucas-Tomasi)特征点跟踪算法(附代码,可扩展)
  4. Ubuntu | ubuntu 中配置静态 IP
  5. 安装 |GitBash闪退问题解决方案及Git安装教程( win10系统安装Git后)
  6. 项目开发时前端及数据库遇到的问题
  7. android 测试网,Android Monkey测试
  8. 自考计算机软件基础交作业,全国2009年7月自考计算机软件基础(二)试题及答案...
  9. linux 解决依赖性错误,linux – 由于单模块依赖性,XSP配置失败
  10. 仪表指针样式_Qt自定义Widget之仪表盘