Android View 的繪制流程總結(jié)

Android View 的繪制流程 - 開篇 MeasureSpec
Android View 的繪制流程 01 - 前置流程
Android View 的繪制流程 02 - performMeasure
Android View 的繪制流程 03 - performLayout
Android View 的繪制流程 04 - performDraw

耗時(shí)1個(gè)多月, 期間斷斷續(xù)續(xù)的看和學(xué)習(xí). 總算是把Android View 的繪制流程弄清楚了.

不過僅僅只是流程, 還有很多細(xì)節(jié)沒有學(xué)習(xí)到. 這就需要后面的不斷積累和查看源碼了. 有了流程, 再去看源碼, 就會(huì)覺得清晰了很多.

經(jīng)過這次學(xué)習(xí), 包括前面學(xué)習(xí)的 setContentView 流程, 再結(jié)合網(wǎng)上的一些博客, 大概的弄清了 Activity, DecorView, Window, ViewRoot 他們之間的關(guān)系

繪制了一張圖, 來代表 Android View 繪制的全部過程, 從 Activity 啟動(dòng)流程中調(diào)用 ActivityThread.handleLaunchActivity() 方法開始, 一直到 preforDraw() 結(jié)束. 圖中, 有什么不對(duì)的地方, 歡迎大家指正, 一起學(xué)習(xí),共同進(jìn)步.


View 繪制的全部流程

現(xiàn)在需要對(duì) Android View 繪制流程做一些總結(jié)和一些網(wǎng)上收集到的.

  1. 只有在 onMeasure 測(cè)量的時(shí)候, 是一直遍歷到最后才開始測(cè)量葉子 View, 然后一級(jí)一級(jí)的再向上傳遞葉子 View 的測(cè)量結(jié)果.根據(jù)所有葉子View 的測(cè)量結(jié)果來測(cè)量父容器.

  2. measure 過程中, 子View 是要根據(jù)父容器的測(cè)量規(guī)格與自己的屬性來確定自己的測(cè)量規(guī)格.

  3. measure 完成后得到的是對(duì)每個(gè) View 經(jīng)測(cè)量過的 measuredWidth 和 measuredHeight.

  4. layout 布局?jǐn)[放的時(shí)候, 真正執(zhí)行布局?jǐn)[放的方法是 View.setFrame() 方法. 根據(jù) onMeasure 測(cè)量結(jié)果進(jìn)行布局?jǐn)[放.

  5. layout 完成之后得到的是對(duì)每個(gè) View 進(jìn)行位置分配后的 mLeft, mTop, mRight, mBottom, 這些值都是相對(duì)于父View來說的.

  6. onDraw 需要我們自己去實(shí)現(xiàn),從而繪制內(nèi)容.

  7. dispatchDraw 在 ViewGroup 已經(jīng)實(shí)現(xiàn)好了, 默認(rèn)會(huì)調(diào)用子 View 的 draw() 方法.

  8. View 繪制的順序, 就是我們給一個(gè) ViewGroup 添加子View 的順序.

  9. layout 是對(duì)本身 View 的布局, onLayout, 是對(duì)所有子 View進(jìn)行布局. layout 中 就是通過 setFrame() 方法設(shè)定本身 View 的四個(gè)頂點(diǎn)的位置, 這四個(gè)位置確定后, 本身 View 的位置就固定了. 然后調(diào)用 onLayout 來布局子View, View 和 ViewGroup 的 onLayout 方法都沒有實(shí)現(xiàn), 留給我們自己給子View布局

  10. ViewGroup 默認(rèn)是不會(huì)執(zhí)行 onDraw 方法的. 因?yàn)?ViewGroup 多數(shù)只是負(fù)責(zé)布局, 不負(fù)責(zé) draw. 如果想要 ViewGroup 進(jìn)行 onDraw 怎么辦, 可以調(diào)用 setWillNotDraw(false) 方法, 里面參數(shù)傳 false 即可. ViewGroup 在初始化的時(shí)候, 默認(rèn)這個(gè)標(biāo)志位是 true. 如果我們自定義的 View 不需要 draw 的話, 就可以調(diào)用這個(gè)方法, 設(shè)置為 true. 這樣系統(tǒng)就知道這個(gè) View 是不需要繪制的. 可以優(yōu)化執(zhí)行速度. View 中 這個(gè)標(biāo)志位一半都是關(guān)閉的(false狀態(tài)).

  11. invalidate 方法和 View 繪制的關(guān)系.

    1. invalidate 方法會(huì)會(huì)請(qǐng)求重繪 View 樹. 調(diào)用 draw 方法. 如果 View 的大小沒有發(fā)生變化就不會(huì)調(diào)用 layout 的流程, 并且只會(huì)繪制那些需要重繪的 View, 也就是哪個(gè) View 請(qǐng)求 invalidate, 就繪制該View. (View 就只繪制該 View, ViewGroup 就會(huì)繪制整個(gè) View Group)

    2. 直接調(diào)用 invalidate 方法, 會(huì)繪制調(diào)用者本身.

    3. 觸發(fā) setSelection 方法, 會(huì)繪制調(diào)用者本身.

    4. 觸發(fā) setVisibility 方法,
      當(dāng) View 可視狀態(tài)在 INVISIBLE 轉(zhuǎn)換 VISIBLE 時(shí)會(huì)間接調(diào)用 invalidate 方法详羡,繪制該View.
      當(dāng) View 的可視狀態(tài)在 INVISIBLE\VISIBLE 轉(zhuǎn)換為 GONE 狀態(tài)時(shí)會(huì)間接調(diào)用 requestLayout 和 invalidate 方法嘿悬,同時(shí)由于 View 樹大小發(fā)生了變化,所以會(huì)請(qǐng)求 measure 過程以及 draw 過程善涨,同樣只繪制需要“重新繪制”的視圖。

    5. 觸發(fā) setEnabled 方法, 不會(huì)重新繪制任何 View 包括當(dāng)前調(diào)用者本身.

    6. 觸發(fā) requestFocus 方法, 只會(huì)繪制需要重繪的 View .

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蟹漓,一起剝皮案震驚了整個(gè)濱河市源内,隨后出現(xiàn)的幾起案子葡粒,更是在濱河造成了極大的恐慌膜钓,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轮纫,死亡現(xiàn)場(chǎng)離奇詭異焚鲜,居然都是意外死亡掌唾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門凭语,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撩扒,“玉大人,你說我怎么就攤上這事搓谆。” “怎么了黔寇?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵斩萌,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我颊郎,道長(zhǎng),這世上最難降的妖魔是什么姆吭? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任猾编,我火速辦了婚禮,結(jié)果婚禮上答倡,老公的妹妹穿的比我還像新娘驴党。我一直安慰自己,他們只是感情好港庄,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著渤涌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪实蓬。 梳的紋絲不亂的頭發(fā)上茸俭,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天调鬓,我揣著相機(jī)與錄音,去河邊找鬼腾窝。 笑死居砖,一個(gè)胖子當(dāng)著我的面吹牛虹脯,可吹牛的內(nèi)容都是我干的悯蝉。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼鼻由,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蔼紧?” 一聲冷哼從身側(cè)響起狠轻,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎向楼,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體湖蜕,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡昭抒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了灭返。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡罚缕,死狀恐怖怎静,靈堂內(nèi)的尸體忽然破棺而出喂饥,到底是詐尸還是另有隱情,我是刑警寧澤员帮,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布导饲,位于F島的核電站,受9級(jí)特大地震影響渣锦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜袋毙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胀溺。 院中可真熱鬧皆看,春花似錦仓坞、人聲如沸腰吟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至织阅,卻和暖如春始藕,著一層夾襖步出監(jiān)牢的瞬間蒲稳,已是汗流浹背伍派。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工剩胁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人昵观。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓舌稀,卻偏偏與公主長(zhǎng)得像灼擂,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子剔应,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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