自定义Interpolator
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接口,代码如下所示:
- public class DecelerateAccelerateInterpolator implements TimeInterpolator{
- @Override
- public float getInterpolation(float input) {
- float result;
- if (input <= 0.5) {
- result = (float) (Math.sin(Math.PI * input)) / 2;
- } else {
- result = (float) (2 - Math.sin(Math.PI * input)) / 2;
- }
- return result;
- }
- }
这段代码是使用正弦函数来实现先减速后加速的功能的,因为正弦函数初始弧度的变化值非常大,刚好和余弦函数是相反的,而随着弧度的增加,正弦函数的变化值也会逐渐变小,这样也就实现了减速的效果。当弧度大于π/2之后,整个过程相反了过来,现在正弦函数的弧度变化值非常小,渐渐随着弧度继续增加,变化值越来越大,弧度到π时结束,这样从0过度到π,也就实现了先减速后加速的效果。
同样我们可以将这个算法的执行情况通过曲线图的方式绘制出来,结果如下图所示:
可以看到,这也是一个S型的曲线图,只不过曲线的方向和刚才是相反的。从上图中我们可以很清楚地看出来,一开始纵坐标的变化幅度很大,然后逐渐变小,横坐标到0.5的时候纵坐标变化幅度趋近于零,之后随着横坐标继续增加纵坐标的变化幅度又开始变大,的确是先减速后加速的效果。
那么现在我们将DecelerateAccelerateInterpolator在代码中进行替换,如下所示:
- private void startAnimation() {
- Point startPoint = new Point(getWidth() / 2, RADIUS);
- Point endPoint = new Point(getWidth() / 2, getHeight() - RADIUS);
- ValueAnimator anim = ValueAnimator.ofObject(new PointEvaluator(), startPoint, endPoint);
- anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator animation) {
- currentPoint = (Point) animation.getAnimatedValue();
- invalidate();
- }
- });
- anim.setInterpolator(new DecelerateAccelerateInterpolator());
- anim.setDuration(3000);
- anim.start();
- }
非常简单,就是将DecelerateAccelerateInterpolator的实例传入到setInterpolator()方法当中。重新运行一下代码,效果如下图所示:
OK!小球的运动确实是先减速后加速的效果,说明我们自定义的Interpolator已经可以正常工作了。通过这样一个程度的学习,相信大家对属性动画Interpolator的理解和使用都达到了一个比较深刻的层次了。
自定义Interpolator相关推荐
- Android属性动画 Interpolator
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/118683683 本文出自[赵彦军的博客] 文章目录 Interpolator Ti ...
- 属性动画Android动画,Android动画(三)属性动画Animator与Interpolator
概述 继上一篇,Android中的视图动画和帧动画可以实现大部分的Android中的动画需求,但是有一个缺点,就是其事件响应区域并没有发生变化,这时候出现了属性动画完全弥补了这个缺点 属性动画结构 可 ...
- 第四章 自定义组件、动画
文章目录 第四章 自定义组件.动画 (一)View体系 (1)View简介 (2)Android坐标系 (3)视图坐标系 (二)自定义View (1)onMeasure:对当前View的尺寸进行测量 ...
- Android 动画之View动画效果和Activity切换动画效果
View动画效果: 1.>>Tween动画 通过对View的内容进行一系列的图形变换(平移.缩放.旋转.透明度变换)实现动画效果,补间动画需要使用<set>节点作为根节点,子节 ...
- Android开发之三种动画
转载:http://www.cnblogs.com/angeldevil/archive/2011/12/02/2271096.html http://www.lightskystreet.com/2 ...
- 动画代码Android动画学习笔记动画代码
间时紧张,先记一笔,后续优化与完善. 3.0之前,android支撑两种动画模式,tween animation,frame animation,在android3.0中又引入了一个新的动画统系:pr ...
- android Animator详解
3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中又引入了一个新的动画系统:property animation,这三 ...
- Android Property Animation动画
3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中又引入了一个新的动画系统:property animation,这三 ...
- android动画详解
转自:工匠若水 http://blog.csdn.net/yanbober 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让全面说说Android的动画,所以今天来一发A ...
最新文章
- 职场中不可深交的五种人
- Vue 全家桶 + Express 实现的博客
- 实战:网店活动付邮试用全攻略
- SAP UI5 使用 Smart Control 的一个具体例子
- 过去的一年,哪些北大人坑死了北大?
- asp.net 子域跨域 带cookie
- windows和linux的共享
- SQL SERVER2000中Transact-SQL语言详解
- Educational Codeforces Round 45 (Rated for Div. 2) G - GCD Counting
- C语言实现24点小游戏,C语言解24点游戏程序
- Ajax学习笔记-get请求参数-3
- html怎样在标签中显示图片,HTML-图片标签学习
- iPhone X (XS XR XSMAX)如何根据状态栏上的图标 获取设备的联网状态(不是单个应用的)
- 使用微信实现查卷返利机器人功能
- 网页打开5秒后弹出广告窗口
- 高中数学怎么学好我的数学学习方法
- 9.23 深度学习微调
- poc服务器作用,poc-POC功能是什么功能? 爱问知识人
- 中国大学mooc c语言作业,中国大学mooc程序设计入门——C语言:第三周测验(示例代码)...
- xcode7.3.1升级iOS10 SDK
热门文章
- 机器人学习--机器人仿真环境汇总
- 机器人学习--栅格地图(occupancy grid map)构建
- Autocad下载 安装 和谐 与 卸载
- 北斗导航 | 惯性导航之基于Matlab的IMU与GPS融合(附源代码)
- 服务器显示AL024是什么意思,中牟县家具木工机械维修台达驱动器al024故障分分钟修复...
- mysql数据库扫描_使用nmap对mysql 数据库进行扫描
- php 查看方法来源,总结查看当前的方法分享
- 450g带盖吐司配方_450g带盖吐司烤多久
- python3精要(9)-字符串表达式,切片步进,字符串与数字转换,字符串不变与修改
- rust(28)-具名结构体