How Android Draws Views 安卓如何繪製view


安卓如何繪製view(How Android Draws Views
當一個activity獲得焦點,activity就會繪製他的佈局。安卓框架會處理繪製的步驟,但是activity必須提供它佈局的根節點。
繪製從佈局根節點開始。它被要求按照佈局的樹形結構進行測量和繪製。
Drawing is handled by walking the tree and rendering each View that intersects the invalid region.
通過遍歷樹和渲染每個子視圖進行繪製
依次,每個ViewGroup負責調用它每個孩子的繪製(用draw()方法)每個View負責自己的繪製。因爲這個樹是按照一定順序排列的,
意思是父佈局和它在樹中出現的兄弟姐妹在它的孩子前繪製。
繪製佈局兩個過程:一個測量步驟和一個佈局步驟。測量步驟在measure(int,int)中實現,自上而下遍歷View樹。每個View在循環期間將尺寸規格疊加到樹上。
在測量最後階段,每個View已經存儲了它的測量值。第二個階段在layout(int,int,int,int)中進行,同樣是自上而下。
在這個階段每個父佈局根據測量階段計算的尺寸負責放置所有它的孩子的位置。
當一個View對象的measure()方法結束後,它的 getMeasuredWidth() and getMeasuredHeight()的值就已經設置好了,
這個View的子節點的值也都有了。一個View對象測量的寬度和測量的高度值必須遵守它的父佈局給它的約束。這個確保在測量最後階段所有的父佈局接收了它所有子View的測量值。
一個父佈局View可能會不止一次調用他孩子的measure()方法。例如,父佈局會用未指定的尺寸測量每個孩子一次找出他們想要多大,
如果在不受約束的情況下測量出的尺寸太大或太小就用確切的數字再調用他們的measure()測一次(如果子View不同意他們互相之間的尺寸,父佈局將會在第二階段進行設置規則並干預)。
測量階段用兩個類來傳遞尺寸數據。 View類用ViewGroup.LayoutParams來告訴父佈局他們怎麼測量和佈局。基類 ViewGroup.LayoutParams只是用來描述View想要多寬多長。它可以指定一下尺寸當中的一個。
MATCH_PARENT
表明View想要和它的父佈局一樣大(減去padding)
WRAP_CONTENT
表明View大小正好包裹自己內容(加上padding)
ViewGroup的不同子類要用到ViewGroup.LayoutParams的不同子類。例如,ViewGroup.LayoutParams有提供給相對佈局的子類,
能讓子View橫向和縱向排列。
測量規格(MeasureSpec)類在樹形結構中從父佈局傳遞到孩子。MeasureSpec可以是下面三種模式之一:
UNSPECIFIED:這個用在一個父佈局獲取孩子想要什麼樣的尺寸。例如,一個線性佈局設置高度爲UNSPECIFIED寬度爲EXACTLY 240調用在它孩子的measure()
找出子View在給定240像素寬度的情況下想要什麼樣的高度。
EXACTLY: 這個用在父佈局強制子View確定的尺寸。子View必須使用這個尺寸,並且保證所有的子節點都遵守這個尺寸。
AT MOST: 這個用在父佈局強制指定一個子View最大值。子View必須保證它和子節點適應這個尺寸。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章