首页 > 代码库 > android FakeWindow的小应用大用途

android FakeWindow的小应用大用途

android FakeWindow的小应用大用途


       在windowmanager里面有一个FakeWindow,细致一看也就是一个透明的应用覆盖到屏幕的最前端,这样有什么优点呢?首先我们还是从应用的需求来看这个问题。在android系统里无论是手机还是平板,状态栏一般都是在的,导航栏在有些设备里面是没有的,由于android须要的那些HOME\BACK\MENU\SERCACH可能已经做在触摸屏上,或者是其它一些低成本的触摸小按键上或者硬按键上,可是也有非常多机器是没有这些的,那么就须要一个导航栏了,这样前期背景就清楚了。

    有了导航栏跟状态栏,好是好,特别是导航栏占屏幕位置啊,在一些须要大屏幕或者全屏的应用中,导航栏跟状态栏显得又是那么碍眼,比方看图片的时候、看电影的时候,一般来说都希望可以全然占据屏幕,这样看效果好一些。要想效果好,就得有方法是不是,当然是。我们知道导航栏跟状态栏属于systemui的范畴,要占据他们的位置,得跟他们好好商议一下吧,还好有windowsmanager的policy来协调。详细位置:

/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/edsam49原创,转载请注明出处,谢谢!
/*****************************************************************************************************/

android\frameworks\base\policy\src\com\android\internal\policy\impl\PhoneWindowManager.java,怎么申请全屏的设计非常easy,笔者在去年的博文中介绍过,须要看的看看这个【SystemUI中状态栏跟导航栏隐藏显示控制方法及效果演示样例】链接:http://blog.csdn.net/edsam49/article/details/11819209

    当你申请了全屏时,phoneWindowsmanager会给给系统加一个FakeWindow来接受触摸屏的输入事件,不限于触摸屏啊,假设是按键的也能截住这个消息。来看看这个FakeWindow是怎么加入到系统的,代码例如以下:

            if (navVisible || navAllowedHidden) {
                if (mHideNavFakeWindow != null) {
                    mHideNavFakeWindow.dismiss();
                    mHideNavFakeWindow = null;
                }
            } else if (mHideNavFakeWindow == null) {
                // add this for navi would show without navigation bar when SYSTEM_UI_FLAG_HIDE_NAVIGATION setted
                if (mFocusedWindow != null) {
                    //Log.i(TAG, "----> chen mFocusedWindow:" + mFocusedWindow);
                    final WindowManager.LayoutParams attr = mFocusedWindow.getAttrs();
                    final CharSequence title =  attr.getTitle();
                    if (!needFullScreenNoNavigationBar(title)) {
		                mHideNavFakeWindow = mWindowManagerFuncs.addFakeWindow(
		                        mHandler.getLooper(), mHideNavInputEventReceiverFactory,
		                        "hidden nav", WindowManager.LayoutParams.TYPE_HIDDEN_NAV_CONSUMER, 0,
		                        0, false, false, true);
                    }
                }
            }
    关键的还是mWindowManagerFuncs.addFakeWindow()这个函数来加入的,详细參数可以看看这个函数原型,也非常easy的,详细可在以下这两个文件里看看:

framework/base/core/java/android/view/WindowManagerPolicy.java跟framework/base/services/java/com/android/server/wm/WindowManagerService.java

     我们在此也大概了解了FakeWindow,也就是在全屏的时候可以截住事件输入,在PhoneWindowsmanager里面这个FakeWindow是一旦收到事件输入消息就dismiss了,就消去,同一时候导航栏什么的该出来就出来了。笔者是在做车载导航产品,我们在倒车的时候,屏幕须要全屏显示倒车视频信号,这个信号是覆盖最上面的,假设倒车的时候你去按屏幕,而这个时候假设不截住这样的事件输入消息,在倒车视频以下的应用不知道会处理得像上面样子,反正你就不知道会点到什么,这样显然是不大好的,那我们就须要在处理倒车视频的把输入事件给截住,当然有人说那我这时候把触摸屏驱动里不往上报数据,那还有按键呢?那也有人说那这个时候,我也不报,假设还有走串口协议过来的呢?还有鼠标呢?键盘呢?一个个的去截,一个个的去disabled,太累了。有了FakeWindow就方便非常多,也就是价格透明窗口来截不论什么输入事件,这样会方便非常多,对系统的开销也不大,差点儿可以忽略不计。

     FakeWindow还是非常实用处的,希望这个介绍对有些同学实用。