android 之view的測量和繪製(群英傳讀書筆記1)

pszh發表於2016-04-26

View的測量

android通過onMeasure()方法去測量一個View的大小,在這裡面系統給我們提供了一個MeasureSpec的類,我們可以通過他來繪製我們的View,看下原始碼

MeasureSpec 是一個32位的int值,其中高2位為測量的模式,低30位的胃測量大小,

測量模式(三種):

(1)EXACTLY:精確值模式  給控制元件設定具體值的時候android:layout_width=“100dp”或者“match_parent”的

(2)AT_MOST :最大值模式 控制元件為wrap_content的時候,此時控制元件尺寸隨著子控制元件或者內容變化,但是尺寸不能超過父控制元件;

(3)UNSPECIFIED :未指明大小的測量模式,View要多大有多大,多在自定義控制元件使用

注:在onMeasure()方法中只支援EXACTLY模式,所以不重寫這個方法時候,只能讓View支援Match_parent或者你指定的100dp的數值,像使用wrap_content 就要重寫此方法


super.onMeasure(widthMeasureSpec, heightMeasureSpec)點進去可以看到 



我們只要把寬和高設定好填進去就可以完成測量工作,所以我們只要在onMeasure()之後把引數設定給 setMeasuredDimension(widthSize , heightSize);方法就可以,

在onMeasure()中,我們呼叫自定義的MeasureWidth()和MeasureHeight(),來重新定義寬高,引數則是寬和高的MeasureSpec的物件,他的物件包含了測量模式和測量值的大小。

我們以ListView的onMeasure()方法為例來進行介紹下如何自定義測量值:

(1) 從MeasureSpec中拿出具體的的測量模式和大小,程式碼:

        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);

(2)通過判斷測量的模式,給出不同的測量值。當specMode為EXACTLY時直接指定大小,為其他的模式的時候要給一個預設的大小,尤其是wrap_content的時候,要取出widthSize,或者是heightSize的最小的一個作為最後的測量值,


具體的可能還需要我們進去看。。。

下面是模板


通過這個我們就可以對寬和高的值去自定義了,

最後可以分三種情況去測試下,

(1)佈局中,指定寬和高都是400dp

  (2) 指定寬和高為match_parent,

  (3)使用wrap_content,  (注:這裡可以看到我們的view是一個200*200px的一個正方形,因為我們在程式碼中有設定預設的大小widthMeasureSpec = 200)

View的繪製

在測量好一個View之後,我們就可以去重寫onDraw()方法了,在Canvas物件來繪製影象。
 
在onDraw()中有一個引數,就是Canvas物件,在其他的地方,初始化是通過 Canvas mCanvas = new Canvas(bitmap);為什麼要使用這個方法,是因為 這樣可以將bitmap和Canvas繫結在一起,在onDraw(Canvas canvas)之外呼叫mCanvas 導致了bitmap發生改變,

ViewGroup的測量:


(1)viewGroup 在測量時通過遍歷所有的子View,從而呼叫子View的measure()獲取子View的測量結果,
(2)子view測量完成後,把子view放到合適的位置是view的Layout過程同樣ViewGroup在執行Layout時也是遍歷所有的子view的Layout,
注:自定義ViewGroup時,通常重寫onLayout去控制子view的位置,同樣如果要支援wrap_content屬性,也要重寫onMeasure()方法。


ViewGroup的繪製:

通常不要繪製,因為他沒有要繪製的東西,(若不指定背景顏色,onDraw()方法都不會呼叫),他只是會呼叫dispatchDraw()方法來繪製子View,過程同樣是遍歷所有的子view的繪製方法來完成工作。

相關文章