<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ViewRoot的setView函數中,會有一個requestLayout。根據前面的分析可知,它會向ViewRoot發送一個DO_TRAVERSAL消息,來看它的handleMessage函數,代碼如下所示: **ViewRoot.java** ~~~ public void handleMessage(Message msg) { switch (msg.what) { ...... case DO_TRAVERSAL: ...... performTraversals();//調用performTraversals函數 ...... break; ...... } } ~~~ 再去看performTraversals函數,這個函數比較復雜,先只看它的關鍵部分,代碼如下所示: **ViewRoot.java** ~~~ private void performTraversals() { finalView host = mView;//還記得這mView嗎?它就是DecorView喔 booleaninitialized = false; booleancontentInsetsChanged = false; booleanvisibleInsetsChanged; try { relayoutResult= //①關鍵函數relayoutWindow relayoutWindow(params, viewVisibility,insetsPending); } ...... draw(fullRedrawNeeded);// ②開始繪制 ...... } ~~~ 1. relayoutWindow的分析 performTraversals函數比較復雜,暫時只關注其中的兩個函數relayoutWindow和draw即可。先看第一個relayoutWindow,代碼如下所示: **ViewRoot.java** ~~~ private intrelayoutWindow(WindowManager.LayoutParams params, int viewVisibility, boolean insetsPending)throws RemoteException { //原來是調用IWindowSession的relayOut,暫且記住這個調用 int relayoutResult = sWindowSession.relayout( mWindow, params, (int) (mView.mMeasuredWidth * appScale + 0.5f), (int) (mView.mMeasuredHeight * appScale + 0.5f), viewVisibility, insetsPending, mWinFrame, mPendingContentInsets, mPendingVisibleInsets, mPendingConfiguration, mSurface); mSurface做為參數傳進去了。 } ...... } ~~~ relayoutWindow中會調用IWindowSession的relayout函數,暫且記住這個調用,在精簡流程后再進行分析。 2. draw的分析 再來看draw函數。這個函數非常重要,它可是Acitivity漂亮臉蛋的塑造大師啊,代碼如下所示: **ViewRoot.java** ~~~ private void draw(boolean fullRedrawNeeded) { Surface surface = mSurface;//mSurface是ViewRoot的成員變量 ...... Canvascanvas; try { int left = dirty.left; int top = dirty.top; int right = dirty.right; int bottom = dirty.bottom; //從mSurface中lock一塊Canvas canvas = surface.lockCanvas(dirty); ...... mView.draw(canvas);//調用DecorView的draw函數,canvas就是畫布的意思啦! ...... //unlock畫布,屏幕上馬上就會見到漂亮寶貝的長相了。 surface.unlockCanvasAndPost(canvas); } ...... } ~~~ UI的顯示好像很簡單嘛!真的是這樣的嗎?在揭露這個“驚天秘密”之前我們先總結一下Activity的顯示流程。
                  <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>

                              哎呀哎呀视频在线观看