自定義View繪制流程中的onMeasure()方法作用是對父布局進行測量,測量繪制控件所需要的空間大小,最后通過setMeasureDimension()設定繪制的實際大小。
在onMeasure()方法中傳入了widthMeasureSpec和heightMeasureSpec,這兩個參數包含了控件的大小和模式。我們只需要通過調用MeasureSpec的兩個方法就可以獲取到控件的大小和模式。
// 獲取控件的模式
int wMode = MeasureSpec.getMode(widthMeasureSpec);
int hMode = MeasureSpec.getMode(heightMeasureSpec);
// 獲取控件的尺寸
int wSize = MeasureSpec.getSize(widthMeasureSpec);
int hSize = MeasureSpec.getSize(heightMeasureSpec);
其中MeasureSpec.getMode()獲取到的結果一共有三種MeasureSpec.UNSPECIFIED, MeasureSpec.EXACTLY, MeasureSpec.AT_MOST。
MeasureSpec.UNSPECIFIED 是未指定尺寸模式,這種情況不多,一般都是父控件是AdapterView,通過measure方法傳入的模式。
MeasureSpec.AT_MOST 是最大尺寸模式,當控件的layout_width或layout_height指定為WRAP_CONTENT時,控件大小一般隨著控件的子空間或內容進行變化,此時控件尺寸只要不超過父控件允許的最大尺寸即可。因此,此時的mode是AT_MOST,size給出了父控件允許的最大尺寸。
MeasureSpec.EXACTLY 是精確尺寸模式,當我們將控件的layout_width或layout_height指定為具體數值時如andorid:layout_width="50dp",或者為match_parent是,都是控件大小已經確定的情況,都是精確尺寸。