View的繪制流程

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()兩個方法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容