View 繪制流程

每一個(gè) View 的繪制過程都必須經(jīng)歷三個(gè)最主要的過程,也就是 measure、layout 和 draw。整個(gè) View 樹的繪圖流程是在 ViewRootImpl 類的 performTraversals() 方法開始的。

measure

MeasureSpec(View 的內(nèi)部類)測量規(guī)格為 int 型,值由高 2 位規(guī)格模式 specMode 和低 30 位具體尺寸 specSize 組成。其中 specMode 只有三種值:EXACTLY 父 View 希望子 View 的大小是確定的,由 specSize 決定,如 match_parent;AT_MOST 父 View 希望子 View 的大小最多是 specSize 指定的值,如 wrap_content;UNSPECIFIED 未指定模式,父 View 完全依據(jù)子 View 的設(shè)計(jì)值來決定。

View 的布局大小由父 View 和子 View 共同決定。

使用 View 的 getMeasuredWidth() 和 getMeasuredHeight() 方法來獲取 View 測量的寬高,必須保證這兩個(gè)方法在 onMeasure 流程之后被調(diào)用才能返回有效值。

layout

整個(gè) layout 過程比較容易理解,layout 是從頂層父 View 向子 View 的遞歸調(diào)用 view.layout 方法的過程,即父 View 根據(jù)上一步 measure 子 View 所得到的布局大小和布局參數(shù),將子 View 放在合適的位置上。

measure 操作完成后得到的是對每個(gè) View 經(jīng)測量過的 measuredWidth 和 measuredHeight,layout 操作完成之后得到的是對每個(gè) View 進(jìn)行位置分配后的 mLeft、mTop、mRight、mBottom,這些值都是相對于父 View 來說的。

使用 View 的 getWidth() 和 getHeight() 方法來獲取 View 測量的寬高,必須保證這兩個(gè)方法在 onLayout 流程之后被調(diào)用才能返回有效值。

draw

如果該 View 是一個(gè) ViewGroup,則需要遞歸繪制其所包含的所有子 View。

View 默認(rèn)不會繪制任何內(nèi)容,真正的繪制都需要自己在子類中實(shí)現(xiàn)。

invalidate & requestLayout

invalidate 會重繪。

requestLayout 會 measure 和 layout。

merge、include、ViewStub

merge 標(biāo)簽在 UI 的結(jié)構(gòu)優(yōu)化中起著非常重要的作用,它可以刪減多余的層級,優(yōu)化 UI。merge 多用于替換當(dāng)一個(gè)布局包含另一個(gè)布局時(shí),merge 標(biāo)簽消除視圖層次結(jié)構(gòu)中多余的層級。

include 就是為了解決重復(fù)定義相同布局的問題。例如你有五個(gè)界面,這五個(gè)界面的頂部都有布局一模一樣的一個(gè)返回按鈕和一個(gè)文本控件,在不使用 include 的情況下你在每個(gè)界面都需要重新在 xml 里面寫同樣的返回按鈕和文本控件的頂部欄,這樣的重復(fù)工作會相當(dāng)?shù)膼盒?。使?include 標(biāo)簽,我們只需要把這個(gè)會被多次使用的頂部欄獨(dú)立成一個(gè) xml 文件,然后在需要使用的地方通過 include 標(biāo)簽引入即可。

ViewStub 就是一個(gè)寬高都為 0 的一個(gè) View,它默認(rèn)是不可見的,只有通過調(diào)用 setVisibility 函數(shù)或者 Inflate 函數(shù)才會將其要裝載的目標(biāo)布局給加載出來,從而達(dá)到延遲加載的效果,這個(gè)要被加載的布局通過 android:layout 屬性來設(shè)置。

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

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

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