View的繪制流程
基本操作由三個函數(shù)完成:measure()、layout()、draw(),其內(nèi)部又分別包含了onMeasure()、onLayout()、onDraw()三個子方法。具體操作如下:
1、measure操作
measure操作主要用于計算視圖的大小,即視圖的寬度和長度。在view中定義為final類型,要求子類不能修改。measure()函數(shù)中又會調(diào)用下面的函數(shù):
(1)onMeasure(),視圖大小的將在這里最終確定,也就是說measure只是對onMeasure的一個包裝,子類可以覆寫 onMeasure()方法實現(xiàn)自己的計算視圖大小的方式,并通過setMeasuredDimension(width,height)保存計算結(jié)果。
2、layout操作layout操作用于設(shè)置視圖在屏幕中顯示的位置。在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ù),將視圖顯示在屏幕上,到這里也就完成了整個的視圖繪制工作。子類也不應(yīng)該修改該方法,因為其內(nèi)部定義了繪圖的基本操作:
(1)繪制背景;
(2)如果要視圖顯示漸變框,這里會做一些準(zhǔn)備工作;
(3)繪制視圖本身,即調(diào)用onDraw()函數(shù)。在view中onDraw()是個空函數(shù),也就是說具體的視圖都要覆寫該函數(shù)來實現(xiàn)自己的顯示(比如 TextView在這里實現(xiàn)了繪制文字的過程)。而對于ViewGroup則不需要實現(xiàn)該函數(shù),因為作為容器是“沒有內(nèi)容“的,其包含了多個子view, 而子View已經(jīng)實現(xiàn)了自己的繪制方法,因此只需要告訴子view繪制自己就可以了,也就是下面的dispatchDraw()方法;
(4)繪制子視圖,即dispatchDraw()函數(shù)。在view中這是個空函數(shù),具體的視圖不需要實現(xiàn)該方法,它是專門為容器類準(zhǔn)備的,也就是容器類必須實現(xiàn)該方法;
(5)如果需要(應(yīng)用程序調(diào)用了setVerticalFadingEdge或者setHorizontalFadingEdge),開始繪制漸變框;
(6)繪制滾動條;
從上面可以看出自定義View需要最少覆寫onMeasure()和onDraw()兩個方法