动画第二步->ValueAnimator:自定义Interpolator

极客学院Animation教程讲解的很详细,点击进入哦

这里为学习的整理和补充O(∩_∩)O

前言

第一次学习的时候,没有记笔记,也没有敲代码,结果再继续学习高级进阶内容时,整个人懵逼了~~~(>_<)~~,so,良心建议大家都敲一敲代码,这里精简并丰富了极客学院的教程,大家一起进步

1、使用插值器,又名加速器

valueAnimator.setInterpolator(new BounceInterpolator());

一行代码就搞定啦,下边才是重点@~@

2、自定义插值器

直接代码O(∩_∩)O

public class MyInterploator implements TimeInterpolator {  
    @Override  
    public float getInterpolation(float input) {  
        return 1-input;  
    }  
} 

然后调用该代码:

ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 400);
valueAnimator.setDuration(3000);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        int curValue = (int) animation.getAnimatedValue();
        view.layout(curValue, curValue, curValue + view.getWidth(), curValue + view.getHeight());
    }});
valueAnimator.setInterpolator(new MyInterpolator());
valueAnimator.start();

会发现view从400->0的方向移动。那么WHY?下面细细道来~

  • 首先看一下源码中的解释:
 /**
A time interpolator defines the rate of change of an animation. 
This allows animations to have non-linear motion, such as acceleration and deceleration. 
*/
public interface TimeInterpolator {
/**
 Maps a value representing the elapsed fraction of an animation to a value that represents     
* the interpolated fraction. This interpolated value is then multiplied by the change in     
* value of an animation to derive the animated value at the current elapsed animation time.     
*     
* @param input A value between 0 and 1.0 indicating our current point   in the animation where 0 represents the start and 1.0 represents the end
 * @return The interpolation value. This value can be more than 1.0 for interpolators which overshoot their targets, or less than 0 for  interpolators that undershoot their targets.    
 */   
 float getInterpolation(float input);
}
中文大意是说:
  • input参数:
    代表理论上当前动画的进度,取值范围是[0,1],0表示开始,1表示结束,从0匀速增加到1.
    egg: 在上述代码中,设置从0—>400,用时3000ms,那么在300ms的时候,input=300/3000=0.1,此时动画本应该在的位置=0+(400-0)*0.1=40。(表达式是:位置=开始值+(结束值-开始值)*进度

  • 返回值:
    代表当前动画实际想要的进度,大于1,超过目标值,小于1,小于开始值。
    egg: 在上述代码中,我们返回值为1-input,这意味着动画实际位置=0+(400-0)*(1-0.1)=360;因此,我们看到动画是从400->0运动的。
    假如返回值为1.5的时候,动画的实际位置=0+(400-0)*1.5=600,代入表达式,以此类推~

所以,我们只要通过input参数,改变返回值,即控制动画实际的进度。切记,input的值一直是匀速增加的,300ms是0.1,600ms是0.2,不会因为返回值而改变的哦

如果有点懵逼的话,那么我们根据AccelerateDecelerateInterpolator实际感受一下<( ̄︶ ̄)↗[GO!]

  • AccelerateDecelerateInterpolator(先加速后减速)解析

首先上源码⬇️

/** 
* An interpolator where the rate of change starts and ends slowly but  accelerates through the middle. 
*/
public class AccelerateDecelerateInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {
 public AccelerateDecelerateInterpolator() {
 }
 @SuppressWarnings({"UnusedDeclaration"})
 public AccelerateDecelerateInterpolator(Context context, AttributeSet attrs) {
 }
 public float getInterpolation(float input) {
 return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;
 } 
/** @hide */
 @Override
 public long createNativeInterpolator() {
 return NativeInterpolatorFactoryHelper.createAccelerateDecelerateInterpolator(); 
}}

我们主要看这里:

 public float getInterpolation(float input) {
 return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;
//翻译为数学表达式就是:0.5\*cos((input+1)\*π)+0.5
 } 

不知道cos函数大家还记得么?忘记的话,快快拾起数学吧,灰常重要~


0.5*cos((input+1)*π)+0.5函数图像

该图是0.5*cos((input+1)*π)+0.5的函数图像,input取值0->1,可以看出:如果input为0的时候,返回值为0,input为0.5的时候,返回值为0.5。根据函数变化图,可以看出返回值先由慢到快增长,然后有增长速率又变慢的过程,这也是动画变化的过程哦。

这里我只讲解这一个插值器,如果有需要,可以进入https://gold.xitu.io/entry/56f9e9a839b05700540ff6e7
该网址讲解了多个插值器滴

后记
如果仍有疑惑的话,就自己多去试试吧,把input(理想进度)作为X值,返回值(实际进度)作为Y值,通过函数图像绘制工具来绘制图像,看看变化速率,敲敲代码,感受感受

最后,不得不说,玩转数学函数,玩转插值器啊,有木有@~@

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让全面说说Android的动画,所以今...
    未聞椛洺阅读 2,688评论 0 10
  • Animation Animation类是所有动画(scale、alpha、translate、rotate)的基...
    四月一号阅读 1,899评论 0 10
  • 一、概述 在Android动画中,总共有两种类型的动画View Animation(视图动画)和Property ...
    summer_lz阅读 741评论 1 0
  • 转载一篇高质量博文,原地址请戳这里转载下来方便今后查看。1 背景不能只分析源码呀,分析的同时也要整理归纳基础知识,...
    Elder阅读 1,937评论 0 24
  • 如果不是校门口昏黄的路灯,将目光投向远方,周小妆觉得自己就是一个盲人。长时间的凝视远处,周小妆有些晕眩,这种被黑暗...
    花生意阅读 207评论 0 0