自定义Interpolator

简介: nterpolator这个东西很难进行翻译,直译过来的话是补间器的意思,它的主要作用是可以控制动画的变化速率,比如去实现一种非线性运动的动画效果。那么什么叫做非线性运动的动画效果呢?就是说动画改变的速率不是一成不变的,像加速运动以及减速运动都属于非线性运动。 不过Interpolator并不是属性动画中新增的技术,实际上从Android 1.0版本开始就一直存在Interp

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 plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class DecelerateAccelerateInterpolator implements TimeInterpolator{  
  2.   
  3.     @Override  
  4.     public float getInterpolation(float input) {  
  5.         float result;  
  6.         if (input <= 0.5) {  
  7.             result = (float) (Math.sin(Math.PI * input)) / 2;  
  8.         } else {  
  9.             result = (float) (2 - Math.sin(Math.PI * input)) / 2;  
  10.         }  
  11.         return result;  
  12.     }  
  13.   
  14. }  
这段代码是使用正弦函数来实现先减速后加速的功能的,因为正弦函数初始弧度的变化值非常大,刚好和余弦函数是相反的,而随着弧度的增加,正弦函数的变化值也会逐渐变小,这样也就实现了减速的效果。当弧度大于π/2之后,整个过程相反了过来,现在正弦函数的弧度变化值非常小,渐渐随着弧度继续增加,变化值越来越大,弧度到π时结束,这样从0过度到π,也就实现了先减速后加速的效果。

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


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

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

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  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的理解和使用都达到了一个比较深刻的层次了。


目录
相关文章
|
XML Android开发 数据格式
Android View动画和属性动画
Android View动画和属性动画
Android View动画和属性动画
|
XML vr&ar Android开发
自定义View | 插值器Interpolator与Evaluator的详解及其自定义运用
自定义View | 插值器Interpolator与Evaluator的详解及其自定义运用
|
API Android开发
【Android 属性动画】属性动画 Property Animation 与 视图动画 View Animation 区别
【Android 属性动画】属性动画 Property Animation 与 视图动画 View Animation 区别
108 0
|
Android开发 开发者
[译]Android 动画的灵魂—— Interpolator
本文讲的是[译]Android 动画的灵魂—— Interpolator,在现实世界中的运动是非线性的。(当你穿过街道时,你只要略微将你盯着手机的眼睛瞄一眼街道就足够保证你不会被车撞到。)当我们走路的时候,我们在加速。
1170 0
|
Android开发
android动画之interpolator和typeEvaluator用法详解
Interpolator (插值器) 我们在写动画的时候为了达到某种效果往往需要设置插值器,用来真实的模拟生活中的场景。  Interpolator (插值器)被用来修饰动画效果,定义动画的变化率,可以使存在的动画效果accelerated(加速),decelerated(减速),repeated(重复),bounced(弹跳)等。 结构图: 常见的插值器:  AccelerateDe
2629 0
|
Android开发
Android 动画中的Interpolator
package android.animation; /** * 时间插值器定义了一个动画的变化率。 * 这让动画让非线性的移动轨迹,例如加速和减速。 * &lt;hr/&gt; * A time interpolator defines the rate of change of an animation. This allows animations * to
1424 0
|
Android开发
Android Property Animation属性动画初识:透明渐变(1)
 Android Property Animation属性动画初识:透明渐变(1) Android Property Animation是Android从3.
788 0