如何理解Android屬性動畫

和之前的文章一樣震缭,沒有使用代碼進行講解赂毯,所以讀者閱讀起來可能有點吃力。我建議閱讀的時候拣宰,結合源碼党涕,效果更佳。文章必定會有疏漏的地方巡社,讀者在閱讀過程如發(fā)現(xiàn)膛堤,請務必指正,不甚感激晌该!

動畫是什么肥荔?

這或許是個簡單的問題,很多人都會回答說“動畫就是一幀幀靜態(tài)畫面的連續(xù)播放”朝群。這樣的回答表明燕耿,動畫的組成元素是每一幀畫面。我們看到的2D動畫就是這樣姜胖。然而我們發(fā)現(xiàn)在電影院誉帅,2D動畫幾乎已經(jīng)絕跡,普遍都是畫質更為逼真,人物表情更為豐富的CG動畫蚜锨。制作CG動畫有一個重要的步驟就是--建模档插,比如人物,花草踏志,建筑物等等都是被獨立看待的一個個模型阀捅。我們以CG動畫的角度看胀瞪,動畫的組成元素是一個個獨立的模型针余。每個模型都有本身的屬性,比如頭發(fā)的弧度凄诞,手臂的位置圆雁,瞳孔的顏色等等。當我們把動畫以幀的方式進行分割帆谍,實際上就割裂了屬性變化的連續(xù)性伪朽。而CG動畫則是以事物屬性為關注點,并且注重屬性變化的連續(xù)性汛蝙,所以效果就更加逼真靈動烈涮。

從2D動畫到CG動畫,是技術的進步窖剑,也是認知的提升坚洽。Android動畫框架也經(jīng)歷了這樣的轉變。

Android早期提供的動畫框架被稱為幀動畫西土,就像2D動畫一樣讶舰,所以也有著2D動畫的缺點--動畫效果卡頓。這使得Android在3.0推出了全新的動畫框架--屬性動畫需了。屬性動畫與CG動畫的核心理念是一樣的--所動畫的是屬性跳昼,而不是幀。Androd官方把屬性動畫框架的開發(fā)稱之為--黃油計劃肋乍,原因顯而易見鹅颊,就是讓動畫像黃油一樣順滑。

我在此談的就是屬性動畫墓造。

動畫回調(diào)何時執(zhí)行挪略?

在回答這個問題之前先談談主線程。主線程又稱UI線程滔岳,主要作用是處理交互事件杠娱,執(zhí)行界面繪制等功能。每個人都能拿這個回答去搪塞別人谱煤,回答問題的人未必在頭腦中建立了主線程運轉機制的模型摊求。線程交互的基本模型就是生產(chǎn)者-消費者模型。在這個模型中工作線程將生產(chǎn)的Runnable刘离,不斷發(fā)送到主線程供其消費室叉。主線程的Run方法存在一個死循環(huán)睹栖,在這個死循環(huán)中,它不斷處理別人生成的Runnable.茧痕。投遞給主線程的Runnable一般分為兩類野来。一類是系統(tǒng)產(chǎn)生的事件,如交互事件踪旷,四大組件的生命周期回調(diào)曼氛;另一類事件是程序自身產(chǎn)生的--那些post系列方法發(fā)送的Runnable,動畫事件回調(diào)令野,界面繪制事件舀患。四大組件的生命周期回調(diào)我們不談及,他是由系統(tǒng)操控的气破。這些Runnable就是胡亂的塞到主線程的消息隊列中的嗎聊浅?顯然不是,絕對不是现使!

問題來了低匙,這些Runnable如何在主線程中進行組織?

所謂組織就是給這些Runnable排個序碳锈,排序標準有兩個:一是這些Runnale之間固有的先后順序顽冶,比如交互事件的處理就應該在繪制事件前面,因為我們只有計算了手移動了多少距離殴胧,才能決定屏幕中的控件移動多少距離渗稍;二是以時間排序,比如postDelayed方法就會延遲Runnable的執(zhí)行团滥。這些事件在主線程的處理順序是:交互事件回調(diào)--動畫事件回調(diào)--界面繪制竿屹。Android系統(tǒng)每隔16ms發(fā)出VSYNC信號,接收到VSYNC信號灸姊,主線程會依次執(zhí)行交互事件回調(diào)拱燃,動畫事件回調(diào),最后觸發(fā)UI繪制力惯。在Android中實現(xiàn)Runnable調(diào)度組織功能的是Choreographer碗誉,它為以上三類事件的分別維護了一個列表。

屬性動畫如何將動畫回調(diào)事件交給Choreographer父晶?

我能想到最簡陋的動畫效果實現(xiàn)就是哮缺,一個放映員不斷切換幻燈片,只要放映員切換速度足夠快甲喝,也能達到"動畫"的效果尝苇。這里有個重要的角色就是切換幻燈片的放映員。Android的屬性動畫也需要這樣一個放映員,我們稱這個放映員為動畫引擎糠溜。

Android屬性動畫的引擎只有一個淳玩,所有的動畫都由這個引擎調(diào)度。這樣做的好處是所有動畫分享相同的時間非竿,那么動畫之間就能同步蜕着。在Android中動畫引擎的實現(xiàn)類是AnimationHandler--組織編排所有動畫的執(zhí)行(每個動畫的啟動時間不一樣,另外有的動畫會延遲執(zhí)行)红柱,根據(jù)動畫時間計算動畫值承匣。AnimationHandler會拿到Choreographer的一個實例,并將自己放置到Choreographer所維護的動畫事件列表中豹芯,隨著每一次VSYNC信號的到來悄雅,而得到執(zhí)行驱敲。

為什么屬性動畫會順滑铁蹈?

之前提到了Android系統(tǒng)會每隔16ms發(fā)出VSYNC信號。為什么是16ms?因為人類視覺能接受到畫面變化的時間就是16ms,當大于16ms,人就會感覺到畫面不連續(xù)众眨,我們稱為卡頓握牧,所以Android會每隔16ms刷新一次畫面。一般的娩梨,我們在動畫回調(diào)中修改了View的某些屬性沿腰,然后緊接著在View的繪制中應用了了這些屬性,這一切都是在這16ms內(nèi)完成的狈定,因而我們感覺到動畫效果是順滑颂龙。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市纽什,隨后出現(xiàn)的幾起案子措嵌,更是在濱河造成了極大的恐慌,老刑警劉巖芦缰,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件企巢,死亡現(xiàn)場離奇詭異,居然都是意外死亡让蕾,警方通過查閱死者的電腦和手機浪规,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來探孝,“玉大人笋婿,你說我怎么就攤上這事《俾” “怎么了缸濒?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我绍填,道長霎桅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任讨永,我火速辦了婚禮滔驶,結果婚禮上,老公的妹妹穿的比我還像新娘卿闹。我一直安慰自己揭糕,他們只是感情好,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布锻霎。 她就那樣靜靜地躺著著角,像睡著了一般。 火紅的嫁衣襯著肌膚如雪旋恼。 梳的紋絲不亂的頭發(fā)上吏口,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音冰更,去河邊找鬼产徊。 笑死,一個胖子當著我的面吹牛蜀细,可吹牛的內(nèi)容都是我干的舟铜。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼奠衔,長吁一口氣:“原來是場噩夢啊……” “哼谆刨!你這毒婦竟也來了?” 一聲冷哼從身側響起归斤,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤痊夭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后官册,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體生兆,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年膝宁,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸦难。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡员淫,死狀恐怖合蔽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情介返,我是刑警寧澤拴事,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布沃斤,位于F島的核電站,受9級特大地震影響刃宵,放射性物質發(fā)生泄漏衡瓶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一牲证、第九天 我趴在偏房一處隱蔽的房頂上張望哮针。 院中可真熱鬧,春花似錦坦袍、人聲如沸十厢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛮放。三九已至,卻和暖如春奠宜,著一層夾襖步出監(jiān)牢的瞬間包颁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工挎塌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留徘六,地道東北人内边。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓榴都,卻偏偏與公主長得像,于是被迫代替她去往敵國和親漠其。 傳聞我的和親對象是個殘疾皇子嘴高,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,756評論 25 707
  • 1. 前言 上一篇文章《Android Animation運行原理詳解》介紹了插間動畫的原理,而Android3....
    SparkInLee閱讀 13,565評論 5 52
  • 為了理解App是如何進行渲染的和屎,我們必須了解手機硬件是如何工作拴驮,那么就必須理解什么是VSYNC。 在講解VSYNC...
    Viking_Den閱讀 4,734評論 1 8
  • 有什么料? 從這篇文章中你能獲得這些料: 知道setContentView()之后發(fā)生了什么随常? 知道Android...
    CoorChice閱讀 26,400評論 42 312
  • 年齡越來越大潜沦,經(jīng)歷越來越多,人變得成熟了绪氛,但能夠放心說出來的話唆鸡,可以聊得來的人也越來越少。認識的人有很多枣察,通訊錄里...
    驀荻閱讀 297評論 0 0