android layout,measure,draw資料收集

寫在前面,本文對網絡中一些關注標題的文章進行了下收集總結,旨在知道每個函數的意義,特別是requestLayout和invalidate這兩個比較常用函數的區別。

首先放一張大神圖
感覺不需要過多解釋了。

然後看過一些相關代碼的都知道有個ViewRootImpl的玩意兒,然後invalidate或者requestLayout都是發消息,然後最終觸發一個超級長的函數:performTraversals。許多分析都很長,估計都看暈了,這個函數簡短來說就是幹了這麼些活:

收集了兩張圖,表達了同一個意思。也不多說了。


在之後收集的文章中,有人提問爲什麼TextView需要先invalidate然後再requestLayout,requestLayout不是包含了invalidate嗎,或者在addView的時候爲什麼requestLayout會調用兩次(外部調一遍,子函數又調一遍)
首先要知道上次函數都是通過發消息的方式執行,而不是直接進行的。然後最終都是通過performTravesal函數來執行的。所以在發消息的時候通過標誌位的設置來決定最後需不需要刷新之類的。再來就是父容器的標誌位可以阻斷子節點的刷新,因爲父容器都刷了,子節點必然會刷新,所以調兩次之類的其實可以省了一些消息發送。具體看我最後的參考資料吧

參考資料:


以下兩篇比較長,在講最複雜的view繪製流程,樓主太懶沒怎麼看

這兩篇主要是講我剛纔說的問題,講的比我清楚。我懶得碼字 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章