view 的繪製過程

來源:互聯網
上載者:User

view的繪製包括三個過程:measure,layout,draw:

(1)measure:

整個View的組成可以看成是一棵樹,measure過程是從根節點(PhoneWindow$DecorView)遍曆所有節點,如果一個View還有子View,則measure子View,直到所有的子View完成measure操作之後,再measure自己,也就是說measure操作是一個後序操作。由父節點給每一個節點的孩子節點節進行measure操作,即在ViewGroup中的measureChildWithMargin()中調用child.measure()方法,而根節點(PhoneWindow$DecorView)不需要measure,因為它預設佔滿了整個螢幕。然後執行到同一操作層次的onMeasure()方法,如果該View還有子View,則調用子View的measure()方法。執行每一個非根節點需要走的measure過程:measure()->onMeasure()-> setMeasuredDimension()。這樣,每一個view都知道了自己的大小。

其中,measure()/setMeasureDimension()是View的最終類,不能被重載,onMeasure需要子View重載。按照前序走訪所有節點,但是最後設定每一個節點的大小(也就是調用SetMeasureDimension())的過程是後序設定的。

(2)layout:

同理,再一次遍曆,對每一個節點的孩子節點layout,根節點不需要layout。同樣,每一個非根節點的節點需要走的layout過程:layout()->onLayout()。其中,layout()是View的最終類,不能重載,onLayout()需要子View的重載。按照前序走訪所有節點,但是最後定位每一個節點的位置(也就是調用onLayout())的過程是後序定位的。

(3)draw:

measure和layout過程執行完成之後,從根節點開始draw,每一個節點(包括根節點)都需要這個draw的過程:draw()->drawbackground->onDraw()->dispatchDraw()->onDrawScrollBars().其中,draw(),onDrawScrollBars()是View的最終類,不能重載,而onDraw被各種Widget(View的子類,如TextView,ImageView等)重載,負責畫自己的視圖。dispatchDraw()被View的子類ViewGroup重載,負責畫它的子View,即重複draw的過程,整個過程是一個遞迴過程。直到布局樹中的葉子節點為止。畫圖過程是前序過程。

ListView的畫圖過程有些特殊,執行measure操作時,只是針對一個Item(它的子View)和它自己進行measure操作,待到執行onLayout()時再一併執行其餘Items的measure和layout操作。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.