android的View
1、android的界面使用組合模式實現。
-ViewGroup --ViewGroup --VieW
2、View繪制主要包括三個步驟:
測量(Measure) :計算View的mMeasuredXXX(即View出現在界面上的寬高)
布局(Layout) :計算View的繪制的位置
繪制(Draw) :使用前面兩步的結果,將View以特定大小,繪制在特定的位置。
3、測量:
1)測量的最終目的是依據View的相關屬性、View與父容器的關系、父容器的相關屬性,計算View的高度和寬度。
2)我們可以重寫onMeasure方法來編碼自己的View測量代碼——計算出View的高度和寬度,使用setMeasuredDimension方法,賦值給mMeasuredXXX相關變量。
3)我們進行測量計算,View的相關屬性可以自己直接獲取,而需要的父容器的一些信息和與父容器關系的信息,就需要引入MeasureSpec包含父容器的信息,然後傳入onMeasure函數。
4)MeasureSpec包含兩個信息:
a)MeasureSpec的模式,exactly(精確模式,即父容器給View的寬高設定了確定的數值),AT_MOST(範圍,即父容器給View的寬高設定了一個範圍),UNSPECIFIED(無限制,父容器沒有給子容器限制。
b)MeasureSpec傳遞的寬高值。
5)View計算寬高除了MeasureSpec的信息外,會用到View自身的minHeight、minWidth和背景圖片的大小等,大多數的View子類會使用不同的其他屬性。
6)ViewGroup子類測量的是時候,一般會獲取計算獲取所有子元素的尺寸,然後依據自身的布局規則,計算自己的尺寸。如FrameLayou可能t獲取的是子元素中最大的,LinearLayout可能是子元素的累加值。
4、布局(Layout):
1) 我們調用View的layout函數,內部會調用setFrame(l,t,r,b)直接確定了View在父容器中的四個方向上的距離值——mRight - mLeft, mBottom - mTop
。所以雖然我們實現的時候,會使用前面計算的View的寬高值,來確定l,t,r,b這四個值,但是View最終繪制時,只是使用這裏傳入值,如果我們這裏修改了,View的寬高會和計算的寬高不同,也就是(getWidth和getMeasuredWidth)獲取的值不同了。
5、繪制(Draw):
繪制的位置和範圍確定了,然後就是繪制內容。
通過重寫onDraw函數實現對View的繪制,繪制的具體內容和View本身有關。
android的View