白話measure,layout,draw

這三者的順序就相當於蓋房子

1)先測量地基,有多大的尺寸可以讓我來操作(measure)

2)再來佈局設計,根據測量後的尺寸來設計出符合自己審美的佈局(layout)

3)繪製,開始真正的裝修了(draw)

 

Measure

主要是調用measure()方法,主要有兩個參數widthMeasureSpec, heightMeasureSpec

MeasureSpec就是測量規格,共32位,分爲高2位和低30位,高2位就是測量模式,低30位就是測量的尺寸大小

通俗來講:按照什麼方法來測量類,前面說着測量規則,後面記錄好測量的尺寸」

測量規則有三種:

UNSPECIFIED :不對View進行任何限制,要多大給多大,一般用於系統內部

EXACTLY:對應LayoutParams中的match_parent和具體數值這兩種模式。檢測到View所需要的精確大小,這時候View的最終大小就是SpecSize所指定的值,

AT_MOST :對應LayoutParams中的wrap_contentView的大小不能大於父容器的大小。
 
那我怎麼知道什麼時候用什麼規則呢?
 
對於DecorView,其確定是通過屏幕的大小,和自身的佈局參數LayoutParams。 根據LayoutParams的佈局格式(match_parentwrap_content指定大小),將自身大小和屏幕大小相比,設置一個不超過屏幕大小的寬高,以及對應模式。
對於其他View(包括ViewGroup),其確定是通過父佈局的MeasureSpec和自身的佈局參數LayoutParams
「通俗來講:你要測量的時候模式是父佈局的格局和你自身準備弄成什麼樣類」

 

測量的步驟:先遍歷測量子View,根據子View的測量值定義自己的寬高信息

Layout

先實現自身的onLayout方法,再一層層的子View.layout方法

[通俗來講:先把自身的大框架風格設計出來,再各個房間的細節設計]

 

Draw

繪製步驟:

1)繪製背景background.draw(canvas) [刷牆]

2)繪製自己(onDraw)[貼磚,吊頂]

3)繪製Children(dispatchDraw) [各個房間的風格繪製]

4)繪製裝飾(onDrawScrollBars)[放點壁畫之類的]

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