屬性動畫認(rèn)知與使用(一切動畫盡在掌握之中)

圖片發(fā)自簡書App

我們熟悉的Frame動畫和Tween動畫是Android 3.0之前的氧敢,這邊就不講解了。今天我要講的是從3.0開始引入的Property動畫曼尊。

Property動畫抓住三個核心概念
1.ValueAnimator
2.ObjectAnimator
3.ViewPropertyAnimator

然后在ValueAnimator中抓住一下兩個概念
1.TypeEvaluator
2.TimeInterpolator

可以說均驶,搞清楚以上5點颓影,一切動畫盡在掌握之中

ValueAnimator

ValueAnimator是整個屬性動畫機(jī)制當(dāng)中最核心的一個類鸳碧,屬性動畫的運(yùn)行機(jī)制是通過不斷地對值進(jìn)行操作來實現(xiàn)的,而初始值和結(jié)束值之間的動畫過渡就是由ValueAnimator這個類來負(fù)責(zé)計算的犬性。

ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);  
anim.setDuration(300);  
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {  
@Override  
public void onAnimationUpdate(ValueAnimator animation) {  
    float currentValue = (float) animation.getAnimatedValue();  
    Log.d("TAG", "cuurent value is " + currentValue);  
  }  
});  
anim.start();  

ObjectAnimator

相比于ValueAnimator瞻离,ObjectAnimator可能才是我們最常接觸到的類,因為ValueAnimator只不過是對值進(jìn)行了一個平滑的動畫過渡乒裆,但我們實際使用到這種功能的場景好像并不多套利。而ObjectAnimator則就不同了,它是可以直接對任意對象的任意屬性進(jìn)行動畫操作的鹤耍,比如說View的alpha肉迫、rotation、translationX和scaleY這幾個值稿黄,分別可以完成淡入淡出喊衫、旋轉(zhuǎn)、水平移動抛猖、垂直縮放這幾種動畫格侯。

ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);  
animator.setDuration(5000);  
animator.start();  

AnimatorSet

AnimatorSet 提供了一個把多個動畫組合成一個組合的機(jī)制,并可設(shè)置組中動畫的時序關(guān)系财著,如同時播放联四,順序播放等。

  • after(Animator anim) 將現(xiàn)有動畫插入到傳入的動畫之后執(zhí)行
  • after(long delay) 將現(xiàn)有動畫延遲指定毫秒后執(zhí)行
  • before(Animator anim) 將現(xiàn)有動畫插入到傳入的動畫之前執(zhí)行
  • with(Animator anim) 將現(xiàn)有動畫和傳入的動畫同時執(zhí)行
ObjectAnimator moveIn = ObjectAnimator.ofFloat(textview, "translationX", -500f, 0f);  
ObjectAnimator rotate = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);  
ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);  
AnimatorSet animSet = new AnimatorSet();  
animSet.play(rotate).with(fadeInOut).after(moveIn);  
animSet.setDuration(5000);  
animSet.start();  

TypeEvalutors

evaluate()方法當(dāng)中傳入了三個參數(shù)撑教,第一個參數(shù)fraction非常重要朝墩,這個參數(shù)用于表示動畫的完成度的,我們應(yīng)該根據(jù)它來計算當(dāng)前動畫的值應(yīng)該是多少伟姐,第二第三個參數(shù)分別表示動畫的初始值和結(jié)束值收苏。那么下面代碼的邏輯就比較清晰了,用結(jié)束值減去初始值愤兵,算出它們之間的差值鹿霸,然后乘以fraction這個系數(shù),再加上初始值秆乳,那么就得到當(dāng)前動畫的值了懦鼠。

public class FloatEvaluator implements TypeEvaluator { 
  public Object evaluate(float fraction, Object startValue, Object endValue) { 
    float startFloat = ((Number) startValue).floatValue(); 
    return startFloat + fraction * (((Number) endValue).floatValue() - startFloat);}
}

TimeInterpolator

Time interplator定義了屬性值變化的方式,如線性均勻改變屹堰,開始慢然后逐漸快等肛冶。在Property Animation中是TimeInterplator,在View Animation中是Interplator扯键,這兩個是一樣的睦袖,在3.0之前只有Interplator,3.0之后實現(xiàn)代碼轉(zhuǎn)移至了TimeInterplator荣刑。Interplator繼承自TimeInterplator馅笙,內(nèi)部沒有任何其他代碼伦乔。

  • AccelerateInterpolator      加速,開始時慢中間加速
  • DecelerateInterpolator      減速延蟹,開始時快然后減速
  • AccelerateDecelerateInterolator 先加速后減速评矩,開始結(jié)束時慢,中間加速
  • AnticipateInterpolator      反向 阱飘,先向相反方向改變一段再加速播放
  • AnticipateOvershootInterpolator  反向加回彈斥杜,先向相反方向改變,再加速播放
  • BounceInterpolator        跳躍沥匈,快到目的值時值會跳躍
  • CycleIinterpolator        循環(huán)蔗喂,動畫循環(huán)一定次數(shù),值的改變?yōu)橐徽液瘮?shù)
  • LinearInterpolator        線性高帖,線性均勻改變
  • OvershottInterpolator       回彈缰儿,最后超出目的值然后緩慢改變到目的值
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 BounceInterpolator());  
anim.setDuration(3000);  
anim.start();  
}  

ViewPropertyAnimator

ViewPropertyAnimator其實算不上什么高級技巧,它的用法格外的簡單散址,只不過和前面所學(xué)的所有屬性動畫的知識不同乖阵,它并不是在3.0系統(tǒng)當(dāng)中引入的,而是在3.1系統(tǒng)當(dāng)中附增的一個新的功能预麸。

textview.animate().x(500).y(500).setDuration(5000);  

源碼上傳在GitHub

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瞪浸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吏祸,更是在濱河造成了極大的恐慌对蒲,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贡翘,死亡現(xiàn)場離奇詭異蹈矮,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鸣驱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門泛鸟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人踊东,你說我怎么就攤上這事谈况。” “怎么了递胧?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長赡茸。 經(jīng)常有香客問我缎脾,道長,這世上最難降的妖魔是什么占卧? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任遗菠,我火速辦了婚禮联喘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辙纬。我一直安慰自己豁遭,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布贺拣。 她就那樣靜靜地躺著蓖谢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪譬涡。 梳的紋絲不亂的頭發(fā)上闪幽,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機(jī)與錄音涡匀,去河邊找鬼盯腌。 笑死,一個胖子當(dāng)著我的面吹牛陨瘩,可吹牛的內(nèi)容都是我干的腕够。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼舌劳,長吁一口氣:“原來是場噩夢啊……” “哼帚湘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蒿囤,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤客们,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后材诽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體底挫,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年脸侥,在試婚紗的時候發(fā)現(xiàn)自己被綠了建邓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡睁枕,死狀恐怖官边,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情外遇,我是刑警寧澤注簿,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站跳仿,受9級特大地震影響诡渴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜菲语,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一妄辩、第九天 我趴在偏房一處隱蔽的房頂上張望惑灵。 院中可真熱鬧,春花似錦眼耀、人聲如沸英支。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽干花。三九已至,卻和暖如春澈吨,著一層夾襖步出監(jiān)牢的瞬間把敢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工谅辣, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留修赞,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓桑阶,卻偏偏與公主長得像柏副,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蚣录,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

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