第10章 GUI系統(tǒng)之“窗口管理員”--WMS

“窗口”是一個抽象的概念,從用戶角度來講,它是一個“界面”;從 SurfaceFlinger 角度來看,它是一個 Layer,承載著和“界面”有關(guān)的數(shù)據(jù)和屬性;從 WMS 的角度來看,它是一個 WindowState,用于管理和“界面”有關(guān)的狀態(tài)。

打個比方,就像一出由N個演員參與的話劇:SurfaceFlinger 是攝像機,WMS 是導(dǎo)演,ViewRoot 則是演員個體。攝像機(SurfaceFlinger)的作用是單一而規(guī)范的,它負(fù)責(zé)客觀地捕獲當(dāng)前的畫面,然后真實地呈現(xiàn)給觀眾;導(dǎo)演(WMS)則會考慮到話劇的舞臺效果和視覺美感,如他需要根據(jù)實際情況來安排各個演員的排序站位,誰在前誰在后,都會影響到演出的“畫面效果”與“劇情編排”;而各個演員(ViewRoot)的長相和表情,則更多地取決于他們自身的條件和努力。

從計算機 I/O 系統(tǒng)的角度來分析,WMS 至少要完成以下兩個功能:

  1. 全局的窗口管理(Output)

應(yīng)用程序的顯示請求在 SurfaceFlinger 和 WMS 的協(xié)助下有序地輸出給物理屏幕或者其他顯示設(shè)備。

  1. 全局的事件管理派發(fā)(Input)

SurfaceFlinger 只做與“顯示”相關(guān)的事情,WMS 還要“兼職”對輸入事件的派發(fā)。

10.1 WMS,AMS 與 Activity 間的關(guān)系

10.2 窗口屬性

窗口類型(Type):

  • Application Window:1-99
  • Sub Window:1000-1999
  • System Window:2000-2999

層級(BaseLayer):

通過 windowTypeToLayerLw 函數(shù)對不同的窗口類型進行簡單映射,映射規(guī)則取決于設(shè)備所采用的 WindowManagerPolicy。

Window Policy 即窗口策略,代表了 Android 顯示系統(tǒng)所遵循的統(tǒng)一的窗口顯示規(guī)則。

窗口屬性:

窗口屬性統(tǒng)一放置在 WindowManager.LayoutParams 中,有如下幾個重要變量:

  1. Type
  2. Flags
  3. systemUiVisibility

10.3 窗口的添加過程

10.4 Surface管理

Surface 申請流程(relayout)

WMS 原則上只負(fù)責(zé)管理“窗口”的層級和屬性,而 SurfaceFlinger 才是真正將窗口數(shù)據(jù)合成并最終顯示到屏幕上的系統(tǒng)服務(wù)。

Surface 的跨進程傳遞

Surface(Java)對象在兩個地方會被創(chuàng)建:

  • ViewRootImp:對應(yīng)的是 ViewRootImp 的成員變量 mSurface,而且它在一開始就分配了一個“空”的 Surface 對象。

  • WindowStateAnimator:當(dāng) WMS 調(diào)用 WindowStateAnimator 的 createSurfaceLocked 時,將生成一個真正有效的 Surface 對象,且由其成員變量 mSurfaceControl 管理。

10.5 performLayoutAndPlaceSurfacesLockedinner

從函數(shù)名大概可以猜出它的設(shè)計意圖,即 Perfrom Layout 和 Place Surface。Layout 在這里側(cè)重表達的是“尺寸大小”的意思,即每個窗口所占的空間;后者則與 SurfaceFlinger 有關(guān) -- WMS 是“導(dǎo)演”,它需要將自己的意圖告訴“攝影機”(Surface)。

10.6 窗口大小的計算過程

SYSTEM_UI_FLAG_FULLSCREEN:用戶要求全屏。

SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:“假設(shè)”當(dāng)前已經(jīng)是全屏。

10.7 啟動窗口的添加和銷毀

10.8 窗口動畫

窗口動畫類型

  • AppWindowAnimator:AppWindowToken 中的成員變量 mAppAnimator 即代表了此應(yīng)用程序所屬的 AppWindowAnimator 動畫。

  • WindowStateAnimator:WindowManagerService 記錄了所有窗口的 WindowState,其中 WindowState.mWinAnimator 是一個 WindowStateAnimator 對象。它和上面的 AppWindowAnimator 一樣都是可以由應(yīng)用開發(fā)人員自行定制的。

  • ScreenRotationAnimator:屏幕旋轉(zhuǎn)動畫。WindowManagerService 中的 mAnimator 是一個 WindowAnimator 類型的對象,其中 WindowAnimator.mScreenRorationAnimation 即屏幕旋轉(zhuǎn)動畫。

動畫流程追蹤--WindowStateAnimator

1.獲取對應(yīng)的動畫id
2.加載動畫
3.設(shè)置動畫

AppWindowAnimator

當(dāng)啟動一個新的 Activity 時,AMS 會根據(jù)當(dāng)前的實際情況來判斷是否為應(yīng)用程序設(shè)置 AppWindowAnimator 以及動畫的類型。

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

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