MeasureSpec,自定義控制項

2021-07-01 19:06:34 字數 1915 閱讀 1610

在自定義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變數,這裡這個模式這個引數,傳三個常量中的乙個。

public

static

int

makemeasurespec

(intsize, 

int

mode)

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

public

static

intgetmode(

intmeasurespec)

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

public

static

intgetsize(

intmeasurespec)

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

public

staticstring 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方法傳入的模式。

declare styleable自定義控制項的屬性

name custom background format reference color 1,reference 引入某一資源id 2,color 輸入顏色值 3 boolean 輸入true或者false 4,dimension 輸入尺寸如20dp等 5,enum 列舉值 6,flag 位或者運...

Android 自定義ViewGroup控制項

實現乙個簡單的組合viewgroup控制項topbar 首先要在values目錄下建立乙個attrs.xml檔案,設定一些自定義控制項的屬性 然後建立乙個自定義控制項繼承viewgroup,這裡直接繼承relativelayout public class topbar extends relati...

自定義 如何自定義協議

何為自定義協議,其實是相對標準協議來說的,這裡主要針對的是應用層協議 常見的標準的應用層協議如http ftp smtp等,如果我們在網路通訊的過程中不去使用這些標準協議,那就需要自定義協議,比如我們常用的rpc框架 dubbo,thrift 分布式快取 redis,memcached 等都是自定義...