自定義控制項的模式

2021-08-18 12:45:41 字數 2166 閱讀 9646

在自定義view和viewgroup的時候,我們經常會遇到int型的measurespec來表示乙個元件的大小,這個變數裡面不僅有元件的尺寸大小,還有大小的模式。

這個大小的模式,有點難以理解。在系統中元件的大小模式有三種:

1.精確模式(measurespec.exactly)

在這種模式下,尺寸的值是多少,那麼這個元件的長或寬就是多少。

2.最大模式(measurespec.at_most)

這個也就是父元件,能夠給出的最大的空間,當前元件的長或寬最大只能為這麼大,當然也可以比這個小。

3.未指定模式(measurespec.unspecified)

這個就是說,當前元件,可以隨便用空間,不受限制。

可能有很多人想不通,乙個int型整數怎麼可以表示兩個東西(大小模式和大小的值),乙個int型別我們知道有32位。而模式有三種,要表示三種狀  態,至少得2位二進位制位。於是系統採用了最高的2位表示模式。如圖:

最高兩位是00的時候表示"未指定模式"。即measurespec.unspecified

最高兩位是01的時候表示"'精確模式"。即measurespec.exactly

最高兩位是11的時候表示"最大模式"。即measurespec.at_most

很多人一遇到位操作頭就大了,為了操作簡便,於是系統給我提供了乙個measurespec工具類。

這個工具類有四個方法和三個常量(上面所示)供我們使用:

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

publicstaticintmakemeasurespec(intsize,intmode)

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

publicstaticintgetmode(intmeasurespec)

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

publicstaticintgetsize(intmeasurespec)

//把這個變數裡面的模式和大小組成字串返回來,方便打日誌

publicstaticstring tostring(intmeasurespec)

measurespec.exactly:當我們將控制項的layout_width或layout_height指定為具體數值時如andorid:layout_width="50dip",或者為fill_parent是,都是控制項大小已經確定的情況,都是精確尺寸。

measurespec.at_most是最大尺寸,當控制項的layout_width或layout_height指定為wrap_content時,控制項大小一般隨著控制項的子空間或內容進行變化,此時控制項尺寸只要不超過父控制項允許的最大尺寸即可。因此,此時的mode是at_most,size給出了父控制項允許的最大尺寸。

measurespec.unspecified是未指定尺寸,這種情況不多,一般都是父控制項是adapterview,通過measure方法傳入的模式。

因此,在重寫onmeasure方法時要根據模式不同進行尺寸計算。下面**就是一種比較典型的方式:

1

@override

2protected

void onmeasure(int widthmeasurespec, int

heightmeasurespec) 56

7private

int getmeasuredlength(int

length, boolean iswidth) else

21}

22return

size;

23 }

自定義控制項的模式

在自定義view和viewgroup的時候,我們經常會遇到int型的measurespec來表示乙個元件的大小,這個變數裡面不僅有元件的尺寸大小,還有大小的模式。這個大小的模式,有點難以理解。在系統中元件的大小模式有三種 1.精確模式 measurespec.exactly 在這種模式下,尺寸的值是...

自定義控制項 自定義鐘錶

private context mcontext 畫筆 private paint mpaint 控制項的寬 private int mwidth x方向的圓心座標 private int center 鐘錶的半徑 private int mradio 圓環的寬 private int stroke...

自定義控制項

首先是以下這幾項,attribute defaultproperty指定元件的預設屬性,toolboxdata指定當從ide工具中的 工具箱中拖動自定義控制項時為它生成的預設標記 defaultproperty text toolboxdata mycontrol runat server 上面這些...