View的繪製流程入門 對郭霖大大文章知識小補充

2021-07-08 17:53:31 字數 2228 閱讀 5818

看郭霖大大的部落格看暈了,經過多番找資料硬啃,終於把這一塊給啃熟了.下面根據自己的理解對郭大的部落格做乙個簡單解釋吧.不知道會不會有和我一樣笨的小白,如果有的話就來一起交流吧.

主要明確幾個問題:

郭霖大大的文章寫了一大串,很多流程,.但是大家看到最後的話還是應該可以知道,乙個view的大小是由它自己的setmeasureddimension(width, height)方法決定的.

但是有好多東西會提供建議權,比如父view會給當前view乙個建議,view自己的xml屬性裡也會建議.但是這些都是次要的.因為別人的建議你可以不聽嘛.

也就是說,爸爸和兒子的xml檔案商量了之後對兒子說:兒子啊,我和你的xml叔叔商量之後,有這麼大個地方(size),你呢按照這樣規格(mode)來計算你自己的大小會比較好.然後呢把mode和size傳給你.但是呢,你比較聽話,你就聽了他們的話.你乙個不高興,你可以直接設定setmeasureddimension(width, height).這一切的最終決定權都在view自身.

當然不是!

本小白剛開始看郭大的文章就是在這裡被繞進去了.關於view的顯示大小,實際上可以這麼理解.系統用一張白紙把view蓋住,但是白紙上有個矩形的洞,矩形的洞裡露出來的大小,就是你實際顯示的大小.那麼乙個view到底在顯示區域裡能顯示多大的內容,也可以理解為白紙上的洞view的**是在**指定的呢?

這就是第三個流程onlayout()中決定的了.

也就是說,onmeasure()根本沒有去測量view在螢幕上的大小,而是在測量view本身的大小.但是為了尊重onmeasure()方法的結果,一般會讓view的顯示大小等於view的測量大小.

那麼view在計算大小的時候,應該怎麼知道自己的可視範圍的大小呢.郭大的文章那麼大的篇幅不都是在分析嘛?現在回頭看看是不是概念清晰了呢?

有些view和view的某個部分被放到了顯示範圍之外,你看不見它,但是不意味著他不存在.它還是在記憶體中的.並且可以被你看到.

什麼?你說怎麼被看到?告訴你,viewgroup有乙個scrollby(distancex,distancey)的方法,就可以移動子view的內容了.類似於這樣:一張有洞的白紙蓋在一塊木板(view)上,木板上有字.但是洞很小,你只能看到看到一部分字.怎麼才能看到其他的字呢?如果白紙不能動的話,當然只能移動木板(onlayout)了.

答案當然是否定的.

這裡就涉及到第三個步驟了,那就是ondraw().

事實上,view 系統希望程式設計師能夠理解,畫布(canvas)是沒有邊界的,即無窮大,程式設計師在自定義乙個具體的view時,應該在 ondraw(canvas canvas)函式中向畫布豐繪製檢視的介面.此時程式設計師應該認為,該畫布是無窮大的,即可以繪製任意多的內容或任意大的圖形(只要記憶體足夠大),然而實際應用中並不會繪製乙個無窮大的介面,那麼到底應該繪製乙個多大的介面呢?對於不同型別的view,其繪製的大小有所不同,一般分為兩種情況,一種是內容型檢視,另一種是圖形型檢視.

所謂內容型檢視一般是指,該檢視將顯示一段文字內容,比 如 textview ,其繪製指的就是顯示一 段文字內容,內容有多少,就應該繪製多少,所以檢視的大小由內容的多少決定.換句話說,該檢視」主宰」了自己的大小.

所謂圖形型檢視一般是指,該檢視顯示的是乙個圖形,比如三角形、正方形、背景圖等,此時該視 圖的大小往往會根據父檢視為該view 開了乙個多大的」視窗」而動態調整. 「視窗」是指,在父檢視看來該view應該占多大的區域,即 布 局 (layout)大小.換句話說,該檢視的大小是」 被主宰」 的, 當然,如果該 view 自己願意,技術上講完全可以不被父檢視的」 視窗」 限制,這 種 「 被主宰」只是實 際的需求而已.比如程式設計師設計了乙個三角形檢視 triview,使用者可以通過 layout—height和layout_width設定該三角形的布局大小,使用者一般會期望該三角形的大小能根據布局大小自動調整, 而不是顯示乙個固定大小的三角形. —-《android核心剖析》

根據上面的描述可知:就算onmeasure()測量出來的大小等於view的可視大小.但是view最終能否顯示完整,還是要看ondraw()裡面到底畫了什麼.比如有個系統控制項datepicker就是內容型的,如果不設定寬高為warp_content,且設定的寬高比它需要的尺寸小的話,此控制項就只能顯示乙個部分了.

總結:最終在螢幕上看見的內容,是當前能看到的所有層的可視範圍的交集.就好像好幾張有洞的白紙疊在一起,能看到的木板的內容就是這幾個洞的範圍的交集.

關於xml檔案和父控制項共同影響下,系統最終給控制項提的建議是什麼?

附圖一張:

View 的繪製流程

view的measure 過程由其measure方法完成,measure 方法是乙個final型別的方法,子類不能重寫。在view的mesure方法中會呼叫onmeasure 我們只看onmeasure方法就可了。view原始碼 protected void onmeasure int widthm...

戲說View的繪製流程

android城中的老張今年收成不錯,玉公尺,麥子收了倉溢庫滿 日子過得紅火不說,幾個兒子也比較爭氣,工作沒幾年就都帶了個女朋友回家 沒辦法兒子大了房子住不下了,必須重新的蓋房不是 咱老百姓不就圖個兒孫滿堂嘛,蓋房子立即提上了老兩口的議事日程 老張量了下前年新分的宅基地 2560x1440 為了體現...

筆記 view的繪製流程

其中viewgroup decorview 的measure方法中會呼叫到他的onmeasure方法,在這個方法中會呼叫所有子元素的measure方法來對子元素進行測量寬和高,這樣就把測量流程傳遞到子元素中,子元素重複父容器的測量流程,從而把所有view都進行測量 layout和draw流程和mea...