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。

相关文章
相关标签/搜索