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

时间:2012-10-12 07:49:04

标签: android layout 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 );

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

layparams .type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
Using updateViewLayout(serviceView, layparams )

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

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

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

您可以通过在updateViewLayout()类的实例上调用WindowManager来完成此操作。

 wm = (WindowManager) getSystemService(WINDOW_SERVICE);

 // create new layout params
 WindowManager.LayoutParams newlayparams = new WindowManager.LayoutParams(
      WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
      WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
      PixelFormat.TRANSLUCENT);

 //update new layout
 wm.updateViewLayout(serviceView, newlayparams);

希望有所帮助!