Android View關(guān)鍵概念

  • View 只支持Padding,不支持Margin, ViewGroup 支持Margin

  • View 負(fù)責(zé)draw自己和handle event, 而Android Framework負(fù)責(zé)measuring, layout.

  • View ID need not be unique throughout the tree, but it is good practice to ensure that they are at least unique within the part of the tree you are searching.

  • LayoutInflator 負(fù)責(zé)從XML文件生成對(duì)應(yīng)的View tree.

  • AttributeSet 代表view的屬性,View的屬性分為兩種,一種是普通屬性,另一種是layout parameters,這種屬性以layout開頭,用來布局。

    View的屬性可以在XML中設(shè)置,也可以在代碼中設(shè)置。

    View支持的屬性需要定義一個(gè)declare-styleable資源,這在定義Custom View時(shí)是必須的。

  • View的繪制過程

    1. 生成View tree

      通過LayoutInflator從XML文件中生成View tree, 此階段從XML中提取出樹型結(jié)構(gòu)來構(gòu)造View tree.從每個(gè)XML TAG中提取出各View Node的屬性。

      此時(shí),各View的大小還沒定下來,只是定個(gè)了各種屬性,其中l(wèi)ayout屬性用在下一階段測(cè)量View的大小上。

    2. 遍歷View tree,求得各Node View的大小。

      此階段稱為Measure階段,主要是確定各View的Measured大小,其主要利用的是父View所指定的測(cè)量Spec和子View的LayoutParameter屬性。所以說,View的Measured大小是由其父View和子View共同決定的。

      以上大小只是測(cè)量的大小,實(shí)際大小要在Layout階段確定,一般測(cè)量大小就是實(shí)際的大小。

      主要函數(shù):

      onMeasure():如果需要更改測(cè)量行為,需要覆蓋該方法

    3. 再一次遍歷View tree,求得各Node View的布局位置

      此階段是用來確定各Node View的最終擺放位置。

      主要函數(shù):

      onLayout():如果需要更改布局行為,需要覆蓋該方法

    4. 再一次遍歷View tree. 將各Node View繪制出來。

      這是最后一個(gè)階段,確定了大小和位置后就可以繪制View了。

      主要函數(shù):

      onDraw():如果需要更改繪制行為,需要覆蓋該方法

    5. 三個(gè)遍歷的起點(diǎn)都在ViewRoot的performTraversal方法中

  • View 重新繪制

    當(dāng)某一個(gè)View的狀態(tài)更改時(shí),如Button的壓下狀態(tài),此時(shí),需要對(duì)該View進(jìn)行重新繪制。

    第一步是從該View起,不斷向上找其父View,并對(duì)其進(jìn)行標(biāo)記是否需要重繪。直到RootView.

    RootView會(huì)向一個(gè)MESSAGE-QUEUE發(fā)送一個(gè)DO_TRAVERSAL消息,并在handleMessage()中接收該消息,當(dāng)收到該消息后,會(huì)再走一遍performTraversal對(duì)View Tree進(jìn)行遍歷,但這一次View中并沒有要求重新測(cè)量標(biāo)志位,所以并不進(jìn)行measuer pass和layout pass.

    由上可知,View中存在一些標(biāo)志位來決定是否對(duì)其進(jìn)行measure,layout和draw.

  • invalite() 調(diào)用它后,onDraw會(huì)在將來的某一時(shí)間被調(diào)用

  • requestLayout() 調(diào)用該函數(shù)會(huì) schedule a layout pass of the view tree.

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

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

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