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,怎么申请全屏的设计很简单,笔者在去年的博文中介绍过,需要看的看看这个【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()这个函数来添加的,具体参数可以看看这个函数原型,也很简单的,具体可在下面这两个文件中看看:

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还是很有用处的,希望这个介绍对有些同学有用。

    原文作者:edsam
    原文地址: https://blog.csdn.net/edsam49/article/details/24478833
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞