TV開機啓動無焦點問題

  1. win.mEnterAnimationPending = true;  函數

  2. mPolicy.getContentInsetHintLw(attrs, outContentInsets);  動畫

  3. if (mInTouchMode) {  spa

  4.     res |= WindowManagerImpl.ADD_FLAG_IN_TOUCH_MODE;  對象

  5. }  get

  6. if (win == null || win.mAppToken == null || !win.mAppToken.clientHidden) {  it

  7.     res |= WindowManagerImpl.ADD_FLAG_APP_VISIBLE;  io

  8. }  變量

        這段代碼作了四件事情。cli

        第一件事情是將前面所建立的一個WindowState對象win的成員變量mEnterAnimationPending的值設置爲true,表示當前正在增長的窗口須要顯示一個進入動畫。程序

        第二件事情是調用WindowManagerService類的成員變量mPolicy所描述的一個窗口管理策略器的成員函數getContentInsetHintLw來得到當前正在增長的窗口的UI內容邊襯大小,即當前正在增長的窗口能夠在屏幕中所得到的用來顯示UI內容的區域的大小,這一般是要排除屏幕邊框和狀態欄等所佔據的屏幕區域。

       第三件事情是檢查WindowManagerService類的成員變量mInTouchMode的值是否等於true。若是等於true的話,那麼就說明系統運行在觸摸屏模式中,這時候這段代碼就會將返回值res的WindowManagerImpl.ADD_FLAG_IN_TOUCH_MODE位設置爲1。

        第四件事情是檢查當前正在增長的窗口是不是處於可見的狀態。從第二個if語句能夠看出,因爲WindowState對象win的值在這裏不能夠等於null,所以,這裏只有兩種狀況下,前正在增長的窗口是處於可見狀態的。第一種狀況是WindowState對象的成員變量mAppToken的值等於null,這代表當前正在增長的窗口不是一個應用程序窗口,即不是一個Activity組件窗口,那麼它就有多是一個子窗口。因爲子窗口一般是在其父窗口處於可見的狀態下才會建立的,所以,這個子窗口就須要立刻顯示出來的,即須要將它的狀態設置爲可見的。第二種狀況是WindowState對象的成員變量mAppToken的值不等於null,這代表當前正在增長的窗口是一個應用程序窗口。在這種狀況下,WindowState對象的成員變量mAppToken指向的就是一個AppWindowToken對象。當這個AppWindowToken對象的成員變量clientHidden的值等於false的時候,就代表它所描述的一個Activity組件是處於可見狀態的,所以,這時候就須要將該Activity組件的窗口(即當前正在增長的窗口)的狀態設置爲可見的。在當前正在增長的窗口是處於可見狀態的狀況下,這段代碼就會將返回值res的WindowManagerImpl.ADD_FLAG_APP_VISIBLE位設置爲1。

相關文章
相關標籤/搜索