3

我在服务中创建了一个视图,它始终在 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 ,然后外部应用程序工作正常。当 TYPE_SYSTEM_OVERLAY 工作时,当您在视图内触摸时,它将触发视图后面的对象的动作,而不是视图的动作。但是当你一旦触摸视图 TYPE_SYSTEM_ALERT 将被应用,现在视图将正常运行。

当前实现:当在布局参数之间进行切换时,我必须触摸两次才能完成该特定操作。

4

2 回答 2

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);
于 2014-09-03T09:54:40.993 回答
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);

希望对您有所帮助!

于 2012-11-10T17:27:39.077 回答