在自定義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 等都是自定義...