View的繪制流程
基本操作由三個函數(shù)完成:measure()、layout()、draw()猎提,其內部又分別包含了onMeasure()胡桃、onLayout()、onDraw()三個子方法侈咕。具體操作如下:
1公罕、measure操作
measure操作主要用于計算視圖的大小,即視圖的寬度和長度耀销。在view中定義為final類型楼眷,要求子類不能修改。measure()函數(shù)中又會調用下面的函數(shù):
(1)onMeasure()熊尉,視圖大小的將在這里最終確定罐柳,也就是說measure只是對onMeasure的一個包裝,子類可以覆寫 onMeasure()方法實現(xiàn)自己的計算視圖大小的方式狰住,并通過setMeasuredDimension(width,height)保存計算結果张吉。
2、layout操作layout操作用于設置視圖在屏幕中顯示的位置催植。在view中定義為final類型肮蛹,要求子類不能修改。layout()函數(shù)中有兩個基本操作:
(1)setFrame(l,t,r,b)创南,l,t,r,b即子視圖在父視圖中的具體位置伦忠,該函數(shù)用于將這些參數(shù)保存起來;
(2)onLayout()稿辙,在View中這個函數(shù)什么都不會做昆码,提供該函數(shù)主要是為viewGroup類型布局子視圖用的;
3邻储、draw操作
draw操作利用前兩部得到的參數(shù)未桥,將視圖顯示在屏幕上,到這里也就完成了整個的視圖繪制工作芥备。子類也不應該修改該方法冬耿,因為其內部定義了繪圖的基本操作:
(1)繪制背景;
(2)如果要視圖顯示漸變框萌壳,這里會做一些準備工作亦镶;
(3)繪制視圖本身日月,即調用onDraw()函數(shù)。在view中onDraw()是個空函數(shù)缤骨,也就是說具體的視圖都要覆寫該函數(shù)來實現(xiàn)自己的顯示(比如 TextView在這里實現(xiàn)了繪制文字的過程)爱咬。而對于ViewGroup則不需要實現(xiàn)該函數(shù),因為作為容器是“沒有內容“的绊起,其包含了多個子view精拟, 而子View已經(jīng)實現(xiàn)了自己的繪制方法,因此只需要告訴子view繪制自己就可以了虱歪,也就是下面的dispatchDraw()方法;
(4)繪制子視圖蜂绎,即dispatchDraw()函數(shù)。在view中這是個空函數(shù)笋鄙,具體的視圖不需要實現(xiàn)該方法师枣,它是專門為容器類準備的,也就是容器類必須實現(xiàn)該方法萧落;
(5)如果需要(應用程序調用了setVerticalFadingEdge或者setHorizontalFadingEdge)践美,開始繪制漸變框;
(6)繪制滾動條找岖;
從上面可以看出自定義View需要最少覆寫onMeasure()和onDraw()兩個方法