天天看點

Android中自定義View的MeasureSpec使用

一般來說,自定義控件都會去重寫View的onMeasure方法,因為該方法指定該控件在螢幕上的大小。

protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)

onMeasure傳入的兩個參數是由上一層控件傳入的大小,有多種情況,重寫該方法時需要對計算控件的實際大小,然後調用setMeasuredDimension(int, int)設定實際大小。

onMeasure傳入的widthMeasureSpec和heightMeasureSpec不是一般的尺寸數值,而是将模式和尺寸組合在一起的數值。我們需要通過int mode = MeasureSpec.getMode(widthMeasureSpec)得到模式,用int size = MeasureSpec.getSize(widthMeasureSpec)得到尺寸。

mode共有三種情況,取值分别為MeasureSpec.UNSPECIFIED, MeasureSpec.EXACTLY, MeasureSpec.AT_MOST。

1、MeasureSpec.EXACTLY是精确尺寸,當我們将控件的layout_width或layout_height指定為具體數值時如andorid:layout_width="50dip",或者為FILL_PARENT是,都是控件大小已經确定的情況,都是精确尺寸。

2、MeasureSpec.AT_MOST是最大尺寸,當控件的layout_width或layout_height指定為WRAP_CONTENT時,控件大小一般随着控件的子空間或内容進行變化,此時控件尺寸隻要不超過父控件允許的最大尺寸即可。是以,此時的mode是AT_MOST,size給出了父控件允許的最大尺寸。

3、MeasureSpec.UNSPECIFIED是未指定尺寸,這種情況不多,一般都是父控件是AdapterView,通過measure方法傳入的模式。

方法有:

   //這個是由我們給出的尺寸大小和模式生成一個包含這兩個資訊的int變量,這裡這個 模式這個參數,傳三個常量中的一個。

   public static int makeMeasureSpec(int size, int mode)

//這個是得到這個變量中表示的模式資訊,将得到的值與三個常量進行比較。

public static int getMode(int measureSpec)

//這個是得到這個變量中表示的尺寸大小的值。

public static int getSize(int measureSpec)