<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ### 4.1 初識ViewRoot和DecorView 在正式介紹View的三大流程之前,我們必須先介紹一些基本概念,這樣才能更好地理解View的measure、layout和draw過程,本節主要介紹ViewRoot和DecorView的概念。 ViewRoot對應于ViewRootImpl類,它是連接WindowManager和DecorView的紐帶,View的三大流程均是通過ViewRoot來完成的。在ActivityThread中,當Activity對象被創建完畢后,會將DecorView添加到Window中,同時會創建ViewRootImpl對象,并將ViewRootImpl對象和DecorView建立關聯,這個過程可參看如下源碼: root = new ViewRootImpl(view.getContext(), display); root.setView(view, wparams, panelParentView); View的繪制流程是從ViewRoot的performTraversals方法開始的,它經過measure、layout和draw三個過程才能最終將一個View繪制出來,其中measure用來測量View的寬和高,layout用來確定View在父容器中的放置位置,而draw則負責將View繪制在屏幕上。針對performTraversals的大致流程,可用流程圖4-1來表示。 :-: ![](https://img.kancloud.cn/65/a5/65a57064e2c94c9730c6a2db54767dfa_836x611.png) 圖4-1 performTraversals的工作流程圖 如圖4-1所示,performTraversals會依次調用performMeasure、performLayout和performDraw三個方法,這三個方法分別完成頂級View的measure、layout和draw這三大流程,其中在performMeasure中會調用measure方法,在measure方法中又會調用onMeasure方法,在onMeasure方法中則會對所有的子元素進行measure過程,這個時候measure流程就從父容器傳遞到子元素中了,這樣就完成了一次measure過程。接著子元素會重復父容器的measure過程,如此反復就完成了整個View樹的遍歷。同理,performLayout和performDraw的傳遞流程和performMeasure是類似的,唯一不同的是,performDraw的傳遞過程是在draw方法中通過dispatchDraw來實現的,不過這并沒有本質區別。 measure過程決定了View的寬/高,Measure完成以后,可以通過getMeasuredWidth和getMeasuredHeight方法來獲取到View測量后的寬/高,在幾乎所有的情況下它都等同于View最終的寬/高,但是特殊情況除外,這點在本章后面會進行說明。Layout過程決定了View的四個頂點的坐標和實際的View的寬/高,完成以后,可以通過getTop、getBottom、getLeft和getRight來拿到View的四個頂點的位置,并可以通過getWidth和getHeight方法來拿到View的最終寬/高。Draw過程則決定了View的顯示,只有draw方法完成以后View的內容才能呈現在屏幕上。 如圖4-2所示,DecorView作為頂級View,一般情況下它內部會包含一個豎直方向的LinearLayout,在這個LinearLayout里面有上下兩個部分(具體情況和Android版本及主題有關),上面是標題欄,下面是內容欄。在Activity中我們通過setContentView所設置的布局文件其實就是被加到內容欄之中的,而內容欄的id是content,因此可以理解為Activity指定布局的方法不叫setview而叫setContentView,因為我們的布局的確加到了id為content的FrameLayout中。如何得到content呢?可以這樣:ViewGroup content= findViewById (R.android.id.content)。如何得到我們設置的View呢?可以這樣:content.getChildAt(0)。同時,通過源碼我們可以知道,DecorView其實是一個FrameLayout, View層的事件都先經過DecorView,然后才傳遞給我們的View。 :-: ![](https://img.kancloud.cn/0f/4f/0f4fdb4e058900a3a7b10b6d12bc3028_494x611.png) 圖4-2 頂級View:DecorView的結構
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看