自定義View繪制流程中的onMeasure()方法作用是對父布局進(jìn)行測量遇西,測量繪制控件所需要的空間大小洒敏,最后通過setMeasureDimension()設(shè)定繪制的實(shí)際大小譬猫。
在onMeasure()方法中傳入了widthMeasureSpec和heightMeasureSpec焙畔,這兩個參數(shù)包含了控件的大小和模式县遣。我們只需要通過調(diào)用MeasureSpec的兩個方法就可以獲取到控件的大小和模式虱咧。
// 獲取控件的模式
int wMode = MeasureSpec.getMode(widthMeasureSpec);
int hMode = MeasureSpec.getMode(heightMeasureSpec);
// 獲取控件的尺寸
int wSize = MeasureSpec.getSize(widthMeasureSpec);
int hSize = MeasureSpec.getSize(heightMeasureSpec);
其中MeasureSpec.getMode()獲取到的結(jié)果一共有三種MeasureSpec.UNSPECIFIED, MeasureSpec.EXACTLY, MeasureSpec.AT_MOST贡未。
MeasureSpec.UNSPECIFIED 是未指定尺寸模式种樱,這種情況不多,一般都是父控件是AdapterView俊卤,通過measure方法傳入的模式嫩挤。
MeasureSpec.AT_MOST 是最大尺寸模式,當(dāng)控件的layout_width或layout_height指定為WRAP_CONTENT時消恍,控件大小一般隨著控件的子空間或內(nèi)容進(jìn)行變化岂昭,此時控件尺寸只要不超過父控件允許的最大尺寸即可。因此狠怨,此時的mode是AT_MOST约啊,size給出了父控件允許的最大尺寸。
MeasureSpec.EXACTLY 是精確尺寸模式佣赖,當(dāng)我們將控件的layout_width或layout_height指定為具體數(shù)值時如andorid:layout_width="50dp"恰矩,或者為match_parent是,都是控件大小已經(jīng)確定的情況憎蛤,都是精確尺寸外傅。