## 簡介
自定義 View 最關鍵的有三個點:繪制、布局和觸摸反饋。
> 布局:布局過程,就是程序在運行時利用布局文件的代碼來計算出實際尺寸的過程。
>
## 測量階段
上到下遞歸地調用每個 View 或者 ViewGroup 的 measure() 方法,測量他們的尺寸并計算它們的位置
### 確定View大小
這是一個**開發者**、**View**與**ViewGroup**三方相互商量的過程。
* 第一步 開發者
具體值:
match_parent:
wrap_parent:
* 第二步,ViewGroup
收到了開發者對View大小的說明,然后ViewGroup會綜合考慮自己的空間大小以及開發者的請求,然后生成兩個MeasureSpec對象(width與height)傳給View.
~~~
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode=MeasureSpec.getMode(widthMeasureSpec);
int widthSize=MeasureSpec.getSize(widthMeasureSpec);
int heightMode=MeasureSpec.getMode(heightMeasureSpec);
int heightSize=MeasureSpec.getSize(heightMeasureSpec);
}
~~~
Mode的取值有三種,它們代表了ViewGroup的總體態度.
> match_parent--->EXACTLY。怎么理解呢?match_parent就是要利用父View給我們提供的所有剩余空間,而父View剩余空間是確定的,也就是這個測量模式的整數里面存放的尺寸
>
> 固定尺寸(如100dp)--->EXACTLY。用戶自己指定了尺寸大小,我們就不用再去干涉了,當然是以指定的大小為主啦。
>
> wrap_content--->AT_MOST。怎么理解:就是我們想要將大小設置為包裹我們的view內容,那么尺寸大小就是父View給我們作為參考的尺寸,只要不超過這個尺寸就可以啦,具體尺寸就根據我們的需求去設定。
>
* 第三步 view 在該要求下來確定自己的大小并告訴ViewGroup了
大多數情況下,我們如果在布局文件中,對自定義View的layout_width和layout_height不設置wrap_content,我們一般都是不需要進行處理的,但是如果要設置為wrap_content,我們需要在測量時,對寬高進行測量。
重寫onMeasure函數