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

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                參考WindowManagerGlobal.addView()的代碼: **WindowManagerGlobal.java-->WindowManagerGlobal.addView()** ``` publicvoid addView(View view, ViewGroup.LayoutParams params, Display display, Window parentWindow){ ......// 參數檢查 final WindowManager.LayoutParams wparams =(WindowManager.LayoutParams)params; /* ① 如果當前窗口需要被添加為另一個窗口的附屬窗口(子窗口),則需要讓父窗口視自己的情況 對當前窗口的布局參數(LayoutParams)進行一些修改 */ if(parentWindow != null) { parentWindow.adjustLayoutParamsForSubWindow(wparams); } ViewRootImpl root; ViewpanelParentView = null; synchronized (mLock) { ...... // WindowManager不允許同一個View被添加兩次 int index = findViewLocked(view, false); if (index >= 0) { throw new IllegalStateException("......");} // ② 創建一個ViewRootImpl對象并保存在root變量中 root = new ViewRootImpl(view.getContext(), display); view.setLayoutParams(wparams); /* ③ 將作為窗口的控件、布局參數以及新建的ViewRootImpl以相同的索引值保存在三個 **數組中。**到這步為止,我們可以認為完成了窗口信息的添加工作 */ mViews[index] = view; mRoots[index] = root; mParams[index] = wparams; } try{ /* **④ 將作為窗口的控件設置給ViewRootImpl。**這個動作將導致ViewRootImpl向WMS 添加新的窗口、申請Surface以及托管控件在Surface上的重繪動作。這才是真正意義上 完成了窗口的添加操作*/ root.setView(view, wparams, panelParentView); }catch (RuntimeException e) { ...... } } ``` 添加窗口的代碼并不復雜。其中的關鍵點有: - 父窗口修改新窗口的布局參數。可能修改的只有LayoutParams.token和LayoutParams.mTitle兩個屬性。mTitle屬性不必贅述,僅用于調試。而token屬性則值得一提。回顧一下第4章的內容,每一個新窗口必須通過LayoutParams.token向WMS出示相應的令牌才可以。在addView()函數中通過父窗口修改這個token屬性的目的是為了減少開發者的負擔。開發者不需要關心token到底應該被設置為什么值,只需將LayoutParams丟給一個WindowManager,剩下的事情就不用再關心了。父窗口修改token屬性的原則是:如果新窗口的類型為子窗口(其類型大于等于LayoutParams.FIRST\_SUB\_WINDOW并小于等于LayoutParams.LAST\_SUB\_WINDOW),則LayoutParams.token所持有的令牌為其父窗口的ID(也就是IWindow.asBinder()的返回值)。否則LayoutParams.token將被修改為父窗口所屬的Activity的ID(也就是在第4章中所介紹的AppToken),這對類型為TYPE\_APPLICATION的新窗口來說非常重要。從這點來說,當且僅當新窗的類型為子窗口時addView()的parentWindow參數才是真正意義上的父窗口。這類子窗口有上下文菜單、彈出式菜單以及游標等等,在WMS中,這些窗口對應的WindowState所保存的mAttachedWindow既是parentWindow所對應的WindowState。然而另外還有一些窗口,如對話框窗口,類型為TYPE\_APPLICATION, 并不屬于子窗口,但需要AppToken作為其令牌,為此parentWindow將自己的AppToken賦予了新窗口的的LayoutParams.token中。此時parentWindow便并不是嚴格意義上的父窗口了。 - 為新窗口創建一個ViewRootImpl對象。顧名思義,ViewRootImpl實現了一個控件樹的根。它負責與WMS進行直接的通訊,負責管理Surface,負責觸發控件的測量與布局,負責觸發控件的繪制,同時也是輸入事件的中轉站。總之,ViewRootImpl是整個控件系統正常運轉的動力所在,無疑是本章最關鍵的一個組件。 - 將控件、布局參數以及新建的ViewRootImpl以相同的索引值添加到三個對應的數組mViews、mParams以及mRoots中,以供之后的查詢之需。控件、布局參數以及ViewRootImpl三者共同組成了客戶端的一個窗口。或者說,在控件系統中的窗口就是控件、布局參數與ViewRootImpl對象的一個三元組。 * * * * * **注意** :筆者并不認同將這個三元組分別存儲在三個數組中的設計。如果創建一個WindowRecord類來統一保存這個三元組將可以省去很多麻煩。 * * * * * 另外,mViews、mParams以及mRoots這三個數組的容量是隨著當前進程中的窗口數量的變化而變化的。因此在addView()以及隨后的removeView()中都伴隨著數組的新建、拷貝等操作。鑒于一個進程所添加的窗口數量不會太多,而且也不會很頻繁,所以這些時間開銷是可以接受的。不過筆者仍然認為相對于數組,ArrayList或CopyOnWriteArrayList是更好的選擇。 - 調用ViewRootImpl.setView()函數,將控件交給ViewRootImpl進行托管。這個動作將使得ViewRootImpl向WMS添加窗口、獲取Surface以及重繪等一系列的操作。這一步是控件能夠作為一個窗口顯示在屏幕上的根本原因! 總體來說,WindowManagerGlobal在通過父窗口調整了布局參數之后,將新建的ViewRootImpl、控件以及布局參數保存在自己的三個數組中,然后將控件交由新建的ViewRootImpl進行托管,從而完成了窗口的添加。WindowManagerGlobal管理窗口的原理如圖6-3所示。 :-: ![](http://img.blog.csdn.net/20150814133520258?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 圖 6 - 3 WindowManagerGlobal的窗口管理
                  <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>

                              哎呀哎呀视频在线观看