Android:在所有应用程序窗口上方放置不可点击的视图,但位于通知栏

时间:2016-05-24 16:56:26

标签: java android android-windowmanager z-order

很抱歉这个长标题。我基本上想要将SurfaceView添加为窗口,该窗口显示在所有窗口上方但不在通知栏上方(即使在向下拖动时)。我目前的代码是:

WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
                WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
                PixelFormat.TRANSLUCENT);

除非将视图放在通知栏上方,否则此操作非常有效。如果我改为使用TYPE_SYSTEM_ALERT,我可以实现所需的Z顺序,但是我的应用程序将不会响应用户输入。然后我添加了标志FLAG_NOT_TOUCHABLE,然后允许用户根据需要与应用程序组件进行交互。但是,手机上的后退按钮和任务管理器按钮不响应。

无论如何要实现我正在寻找的行为?我希望我说得够清楚,用文字描述我想要的东西有点困难。谢谢!

1 个答案:

答案 0 :(得分:2)

解决!

WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
                WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH |
                        WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN |
                        WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
                        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
                        WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                PixelFormat.TRANSLUCENT);

TYPE_SYSTEM_ALERT可确保系统通知栏保持在我的视图之上。 FLAG_NOT_TOUCH_MODAL允许将触摸事件发送到视图后面的窗口;并FLAG_NOT_TOUCHABLEFLAG_NOT_FOCUSABLE确保视图无法接收触摸或关键事件。