一、自定義VIEW的詳細步驟
1.測量——onMeasure():決定View的大小
2.佈局——onLayout():決定View在ViewGroup中的位置
3.繪製——onDraw():如何繪製這個View。
二、Measure()
而決定View的大小隻需要兩個值:寬測量值(widthMeasureSpec)和高測量值(heightMeasureSpec)。
對於詳細測量值(measureSpec)需要兩樣東西來確定它,那就是大小(size)和模式(mode)。而measureSpec,size,mode他們三個的關係,都封裝在View類中的一個內部類裏,名叫MeasureSpec。
* 父不沒有對子施加任何約束,子可以是任意大小(也就是未指定)
* (UNSPECIFIED在源碼中的處理和EXACTLY一樣。當View的寬高值設置爲0的時候或者沒有設置寬高時,模式爲UNSPECIFIED
* 2.EXACTLY
* 父決定子的確切大小,子被限定在給定的邊界裏,忽略本身想要的大小。
* (當設置width或height爲match_parent時,模式爲EXACTLY,因爲子view會佔據剩餘容器的空間,所以它大小是確定的)
* 3.AT_MOST
* 子最大可以達到的指定大小
* (當設置爲wrap_content時,模式爲AT_MOST, 表示子view的大小最多是多少,這樣子view會根據這個上限來設置自己的尺寸)
最高兩位是01的時候表示"'精確模式"。即MeasureSpec.EXACTLY
最高兩位是11的時候表示"最大模式"。即MeasureSpec.AT_MOST
很多人一遇到位操作頭就大了,爲了操作簡便,於是系統給我提供了一個MeasureSpec工具類。
這個工具類有四個方法和三個常量(上面所示)供我們使用:
//這個是由我們給出的尺寸大小和模式生成一個包含這兩個信息的int變量,這裏這個模式這個參數,傳三個常量中的一個。
public static int makeMeasureSpec(int size, int mode)
//這個是得到這個變量中表示的模式信息,將得到的值與三個常量進行比較。
public static int getMode