動畫第二步->ValueAnimator:自定義Interpolator

極客學(xué)院Animation教程講解的很詳細(xì),點(diǎn)擊進(jìn)入哦

這里為學(xué)習(xí)的整理和補(bǔ)充O(∩_∩)O

前言

第一次學(xué)習(xí)的時候,沒有記筆記岁诉,也沒有敲代碼隧枫,結(jié)果再繼續(xù)學(xué)習(xí)高級進(jìn)階內(nèi)容時喉磁,整個人懵逼了~~~(>_<)~~谓苟,so,良心建議大家都敲一敲代碼协怒,這里精簡并豐富了極客學(xué)院的教程涝焙,大家一起進(jìn)步

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

valueAnimator.setInterpolator(new BounceInterpolator());

一行代碼就搞定啦仑撞,下邊才是重點(diǎn)@~@

2、自定義插值器

直接代碼O(∩_∩)O

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

然后調(diào)用該代碼:

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();

會發(fā)現(xiàn)view從400->0的方向移動妖滔。那么WHY隧哮?下面細(xì)細(xì)道來~

  • 首先看一下源碼中的解釋:
 /**
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參數(shù):
    代表理論上當(dāng)前動畫的進(jìn)度,取值范圍是[0座舍,1]沮翔,0表示開始,1表示結(jié)束,從0勻速增加到1.
    egg: 在上述代碼中,設(shè)置從0—>400曲秉,用時3000ms采蚀,那么在300ms的時候,input=300/3000=0.1,此時動畫本應(yīng)該在的位置=0+(400-0)*0.1=40。(表達(dá)式是:位置=開始值+(結(jié)束值-開始值)*進(jìn)度

  • 返回值:
    代表當(dāng)前動畫實(shí)際想要的進(jìn)度岸浑,大于1搏存,超過目標(biāo)值,小于1矢洲,小于開始值璧眠。
    egg: 在上述代碼中,我們返回值為1-input读虏,這意味著動畫實(shí)際位置=0+(400-0)*(1-0.1)=360;因此责静,我們看到動畫是從400->0運(yùn)動的。
    假如返回值為1.5的時候盖桥,動畫的實(shí)際位置=0+(400-0)*1.5=600灾螃,代入表達(dá)式,以此類推~

所以揩徊,我們只要通過input參數(shù)腰鬼,改變返回值,即控制動畫實(shí)際的進(jìn)度塑荒。切記熄赡,input的值一直是勻速增加的,300ms是0.1齿税,600ms是0.2彼硫,不會因?yàn)榉祷刂刀淖兊呐?/strong>

如果有點(diǎn)懵逼的話,那么我們根據(jù)AccelerateDecelerateInterpolator實(shí)際感受一下<( ̄︶ ̄)↗[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;
//翻譯為數(shù)學(xué)表達(dá)式就是:0.5\*cos((input+1)\*π)+0.5
 } 

不知道cos函數(shù)大家還記得么?忘記的話拧篮,快快拾起數(shù)學(xué)吧词渤,灰常重要~


0.5*cos((input+1)*π)+0.5函數(shù)圖像

該圖是0.5*cos((input+1)*π)+0.5的函數(shù)圖像,input取值0->1串绩,可以看出:如果input為0的時候缺虐,返回值為0,input為0.5的時候赏参,返回值為0.5志笼。根據(jù)函數(shù)變化圖,可以看出返回值先由慢到快增長把篓,然后有增長速率又變慢的過程纫溃,這也是動畫變化的過程哦。

這里我只講解這一個插值器韧掩,如果有需要紊浩,可以進(jìn)入https://gold.xitu.io/entry/56f9e9a839b05700540ff6e7
該網(wǎng)址講解了多個插值器滴

后記
如果仍有疑惑的話,就自己多去試試吧疗锐,把input(理想進(jìn)度)作為X值坊谁,返回值(實(shí)際進(jìn)度)作為Y值,通過函數(shù)圖像繪制工具來繪制圖像滑臊,看看變化速率口芍,敲敲代碼,感受感受

最后雇卷,不得不說鬓椭,玩轉(zhuǎn)數(shù)學(xué)函數(shù),玩轉(zhuǎn)插值器啊关划,有木有@~@

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末小染,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子贮折,更是在濱河造成了極大的恐慌裤翩,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件调榄,死亡現(xiàn)場離奇詭異踊赠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)每庆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門臼疫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人扣孟,你說我怎么就攤上這事∪俑希” “怎么了凤价?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵鸽斟,是天一觀的道長。 經(jīng)常有香客問我利诺,道長富蓄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任慢逾,我火速辦了婚禮立倍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘侣滩。我一直安慰自己口注,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布君珠。 她就那樣靜靜地躺著寝志,像睡著了一般。 火紅的嫁衣襯著肌膚如雪策添。 梳的紋絲不亂的頭發(fā)上材部,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機(jī)與錄音唯竹,去河邊找鬼乐导。 笑死,一個胖子當(dāng)著我的面吹牛浸颓,可吹牛的內(nèi)容都是我干的物臂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼猾愿,長吁一口氣:“原來是場噩夢啊……” “哼鹦聪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蒂秘,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤泽本,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后姻僧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體规丽,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年撇贺,在試婚紗的時候發(fā)現(xiàn)自己被綠了赌莺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡松嘶,死狀恐怖艘狭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤巢音,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布遵倦,位于F島的核電站,受9級特大地震影響官撼,放射性物質(zhì)發(fā)生泄漏梧躺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一傲绣、第九天 我趴在偏房一處隱蔽的房頂上張望掠哥。 院中可真熱鬧,春花似錦秃诵、人聲如沸续搀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽目代。三九已至,卻和暖如春嗤练,著一層夾襖步出監(jiān)牢的瞬間榛了,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工煞抬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留霜大,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓革答,卻偏偏與公主長得像战坤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子残拐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1 背景 不能只分析源碼呀途茫,分析的同時也要整理歸納基礎(chǔ)知識,剛好有人微博私信讓全面說說Android的動畫溪食,所以今...
    未聞椛洺閱讀 2,691評論 0 10
  • Animation Animation類是所有動畫(scale囊卜、alpha、translate错沃、rotate)的基...
    四月一號閱讀 1,900評論 0 10
  • 一栅组、概述 在Android動畫中,總共有兩種類型的動畫View Animation(視圖動畫)和Property ...
    summer_lz閱讀 741評論 1 0
  • 轉(zhuǎn)載一篇高質(zhì)量博文枢析,原地址請戳這里轉(zhuǎn)載下來方便今后查看玉掸。1 背景不能只分析源碼呀,分析的同時也要整理歸納基礎(chǔ)知識醒叁,...
    Elder閱讀 1,937評論 0 24
  • 如果不是校門口昏黃的路燈司浪,將目光投向遠(yuǎn)方泊业,周小妝覺得自己就是一個盲人。長時間的凝視遠(yuǎn)處断傲,周小妝有些暈眩脱吱,這種被黑暗...
    花生意閱讀 208評論 0 0