Hencoder學(xué)習(xí)筆記1-7

【HenCoder Android 開發(fā)進(jìn)階】自定義 View 1-7:屬性動畫(進(jìn)階篇)

針對特殊類型的屬性來做屬性動畫;
針對復(fù)雜的屬性關(guān)系來做屬性動畫督函。

TypeEvaluator

TypeEvaluator 最經(jīng)典的用法是使用 ArgbEvaluator 來做顏色漸變的動畫。

ObjectAnimator animator = ObjectAnimator.ofInt(view, "color", 0xffff0000, 0xff00ff00);
animator.setEvaluator(new ArgbEvaluator());
animator.start();

自定義 Evaluator

// 自定義 HslEvaluator
private class HsvEvaluator implements   TypeEvaluator<Integer> {
 float[] startHsv = new float[3];
 float[] endHsv = new float[3];
 float[] outHsv = new float[3];

@Override
public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
   // 把 ARGB 轉(zhuǎn)換成 HSV
   Color.colorToHSV(startValue, startHsv);
   Color.colorToHSV(endValue, endHsv);

   // 計算當(dāng)前動畫完成度(fraction)所對應(yīng)的顏色值
   if (endHsv[0] - startHsv[0] > 180) {
       endHsv[0] -= 360;
   } else if (endHsv[0] - startHsv[0] < -180) {
       endHsv[0] += 360;
   }
   outHsv[0] = startHsv[0] + (endHsv[0] - startHsv[0]) * fraction;
   if (outHsv[0] > 360) {
       outHsv[0] -= 360;
   } else if (outHsv[0] < 0) {
       outHsv[0] += 360;
   }
   outHsv[1] = startHsv[1] + (endHsv[1] - startHsv[1]) * fraction;
   outHsv[2] = startHsv[2] + (endHsv[2] - startHsv[2]) * fraction;

   // 計算當(dāng)前動畫完成度(fraction)所對應(yīng)的透明度
   int alpha = startValue >> 24 + (int) ((endValue >> 24 - startValue >> 24) * fraction);

   // 把 HSV 轉(zhuǎn)換回 ARGB 返回
   return Color.HSVToColor(alpha, outHsv);
 }
}

ObjectAnimator animator = ObjectAnimator.ofInt(view, "color", 0xff00ff00);
// 使用自定義的 HslEvaluator
animator.setEvaluator(new HsvEvaluator());
animator.start();

借助于 TypeEvaluator浸遗,屬性動畫就可以通過 ofObject() 來對不限定類型的屬性做動畫了埠通。方式很簡單:

為目標(biāo)屬性寫一個自定義的 TypeEvaluator
使用 ofObject() 來創(chuàng)建 Animator骑祟,并把自定義的 TypeEvaluator 作為參數(shù)填入

PropertyValuesHolder 同一個動畫中改變多個屬性

PropertyValuesHolder holder1 = PropertyValuesHolder.ofFloat("scaleX", 1);
PropertyValuesHolder holder2 = PropertyValuesHolder.ofFloat("scaleY", 1);
PropertyValuesHolder holder3 = PropertyValuesHolder.ofFloat("alpha", 1);

ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(view, holder1, holder2, holder3)
animator.start();

AnimatorSet 多個動畫配合執(zhí)行

ObjectAnimator animator1 = ObjectAnimator.ofFloat(...);
animator1.setInterpolator(new LinearInterpolator());
ObjectAnimator animator2 = ObjectAnimator.ofInt(...);
animator2.setInterpolator(new DecelerateInterpolator());

AnimatorSet animatorSet = new AnimatorSet();
// 兩個動畫依次執(zhí)行
animatorSet.playSequentially(animator1, animator2);
// 兩個動畫同時執(zhí)行
animatorSet.playTogether(animator1, animator2);
// 使用       AnimatorSet.play(animatorA).with/before/after(animatorB)
// 的方式來精確配置各個 Animator 之間的關(guān)系
animatorSet.play(animator1).with(animator2);
animatorSet.play(animator1).before(animator2);
animatorSet.play(animator1).after(animator2);
animatorSet.start();

PropertyValuesHolders.ofKeyframe() 把同一個屬性拆分

// 在 0% 處開始
Keyframe keyframe1 = Keyframe.ofFloat(0, 0);
// 時間經(jīng)過 50% 的時候声怔,動畫完成度 100%
Keyframe keyframe2 = Keyframe.ofFloat(0.5f, 100);
// 時間見過 100% 的時候态贤,動畫完成度倒退到 80%,即反彈 20%
Keyframe keyframe3 = Keyframe.ofFloat(1, 80);
PropertyValuesHolder holder =   PropertyValuesHolder.ofKeyframe("progress", keyframe1, keyframe2, keyframe3);

ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(view, holder);
animator.start();

「關(guān)于復(fù)雜的屬性關(guān)系來做動畫」醋火,就這么三種:

1.使用 PropertyValuesHolder 來對多個屬性同時做動畫抵卫;
2.使用 AnimatorSet 來同時管理調(diào)配多個動畫;
3.PropertyValuesHolder 的進(jìn)階使用:使用 PropertyValuesHolder.ofKeyframe() 來把一個屬性拆分成多段胎撇,執(zhí)行更加精細(xì)的屬性動畫。

ValueAnimator 最基本的輪子

遵循一個原則就行:盡量用簡單的殖氏。能用 View.animate() 實現(xiàn)就不用 ObjectAnimator晚树,能用 ObjectAnimator 就不用 ValueAnimator。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雅采,一起剝皮案震驚了整個濱河市爵憎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌婚瓜,老刑警劉巖宝鼓,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異巴刻,居然都是意外死亡愚铡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門胡陪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沥寥,“玉大人,你說我怎么就攤上這事柠座∫匮牛” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵妈经,是天一觀的道長淮野。 經(jīng)常有香客問我捧书,道長,這世上最難降的妖魔是什么骤星? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任经瓷,我火速辦了婚禮,結(jié)果婚禮上妈踊,老公的妹妹穿的比我還像新娘了嚎。我一直安慰自己,他們只是感情好廊营,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布歪泳。 她就那樣靜靜地躺著,像睡著了一般露筒。 火紅的嫁衣襯著肌膚如雪呐伞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天慎式,我揣著相機(jī)與錄音伶氢,去河邊找鬼。 笑死瘪吏,一個胖子當(dāng)著我的面吹牛癣防,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播掌眠,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蕾盯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蓝丙?” 一聲冷哼從身側(cè)響起级遭,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎渺尘,沒想到半個月后挫鸽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡鸥跟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年丢郊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锌雀。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡蚂夕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出腋逆,到底是詐尸還是另有隱情婿牍,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布惩歉,位于F島的核電站等脂,受9級特大地震影響俏蛮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜上遥,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一搏屑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧粉楚,春花似錦辣恋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至燃异,卻和暖如春携狭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背回俐。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工逛腿, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人仅颇。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓单默,卻偏偏與公主長得像,于是被迫代替她去往敵國和親忘瓦。 傳聞我的和親對象是個殘疾皇子雕凹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

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