當一個Activity獲得焦點,它會請求繪制其佈局。Android框架將會管理繪制的過程,但是Activity必須提供佈局層次中的根節點。
繪制視圖是從佈局的根節點開始。請求計算和繪制佈局樹。繪制負責遍歷樹和渲染每個可交互的無效區域。依次的,每一個View group負責請求繪制其子View,每一個View負責繪制自己(利用draw()方法)。因為樹是順序遍歷的,這就意味著先畫父節點(父View在子View背後),然後依照樹的次序來繪制其他同級節點。
Android框架隻會重繪無效的區域,而且還會幫你繪制背景圖片。
你能夠利用invalidate()方法強制重繪View。
繪制佈局就是兩個傳遞的過程:一個測量傳遞和佈局傳遞。測量傳遞是實現measure(int,int)方法和從上至下遍歷視圖樹。每一個視圖在遞歸時傳遞尺寸規格下去。在尺寸傳遞的最後,每一個視圖都存儲瞭尺寸。第二個傳遞發生在layout(int,int,int,int)同樣也是自上而下的。在這個傳遞期間每一個父節點都負責利用測量傳遞的數據計算其尺寸並且來定位其子節點。
當View的measure()方法返回,它的getMeasuredWidth()和getMeasuredHeight()的值必須被設置,以及View所有後代的。View的測量寬度和測量高度的值必須符合View的父節點施加的約束。這樣就可以保證測量傳遞的最後,所有的父節點接受他們子節點的尺寸值。一個父節可以會對其子節點調用多次measure()方法。比如,父節點可以通過每一個子節點不明確的尺寸調用measure()方法找出它們想要多大,然後就會使用實際的數值調用measure()方法,如果所有子節點沒有受約束的尺寸的總大小太大瞭或太小瞭(既,如果子節點不同意每個之間的空間,父節點會介入並且設置第二階段的規則)。
更新一個佈局,調用requestLayout()這個方法是通常View認為自己已經不適合當前的佈局時調用。
測量傳遞利用兩個類來交流尺寸。
·TheView.MeasureSpec類通常用於View告訴他們的父節點他們想怎樣計算和定位。
·基礎的LayoutParams類隻是描述View想要長和寬的大小。每一個尺寸都可以指定:
&一個確定的值
&FILL_PARENT,表示View想和父節點一樣大小(減去填充)
&WRAP_CONTENT,表示View隻是想包容其內容大小(加上填充)
每一個ViewGroup的子類都有對應的LayoutParams子類。例如:RelativeLayout有它自己的LayoutParams,包括能夠讓子視圖橫向和縱向居中的能力。
MeasureSpecs通常用於在樹中沿著父節點到子節點下傳需求,MeasureSpec可以是三種模式之一:
&UNSPECIFIED:通常用於父節點決定要求子節點的尺寸。例如:LinearLayout可能在其子節點調用measure()方法,設置它的高為UNSPECIFIED,寬為EXACTLY 240找出子View在寬為240像素時的高度。
&EXACTLY:通常用於父節點利用一個絕對的尺寸的child。child必須使用這個尺寸並且保證所有的子節點將會適應這個尺寸。
&AT_MOST:通常用於parent利用最大值尺寸的child。這個child必須保證其所有的子節點適應這個尺寸。
作者:ldj299