在TYPE_SYSTEM_ALERT和TYPE_SYSTEM_OVERLAY之间切换,并捕获触摸事件无法正常工作

use*_*283 3 layout android params

我在服务中创建了一个View,它始终位于android中的每个应用程序之上.

最初,服务的行为是TYPE_SYSTEM_ALERT.

WindowManager.LayoutParams layparams = new WindowManager.LayoutParams(
 WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.WRAP_CONTENT, 
 WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
 WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
 PixelFormat.TRANSLUCENT);
 layparams .gravity = Gravity.CENTER_VERTICAL| Gravity.CENTER_HORIZONTAL;
 wm = (WindowManager) getSystemService(WINDOW_SERVICE);
 wm.addView(serviceView, layparams );
Run Code Online (Sandbox Code Playgroud)

我在运行时更改服务的行为意味着在触摸时在TYPE_SYSTEM_ALERT和TYPE_SYSTEM_OVERLAY之间切换.当我在视图参数外部触摸时以及在视图参数内触摸时,会发生切换.

layparams .type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
Using updateViewLayout(serviceView, layparams )
Run Code Online (Sandbox Code Playgroud)

问题:当我在视图外触摸时,第一次触摸只是激活TYPE_SYSTEM_OVERLAY然后外部app工作正常.当TYPE_SYSTEM_OVERLAY工作时,在此之后触摸视图时,它将触发视图后面的对象操作而不是视图的操作.但是当你触摸视图时,将应用TYPE_SYSTEM_ALERT,现在View将正常运行.

当前实现:当在布局参数之间进行切换时,我必须触摸两次来处理特定的事情.

小智 5

使用这个......在ICS及以上版本上完美运行

params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;//This one is necessary.
params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH |
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
params.gravity = Gravity.TOP | Gravity.RIGHT;
params.x = 0;
params.y = -params.height;
windowManager.addView(tile, params);
Run Code Online (Sandbox Code Playgroud)