我在服务中创建了一个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将正常运行。
当前实施:在布局参数之间进行切换时,我必须触摸两次以处理特定事情。
答案 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);
希望有所帮助!