Android:多点触控和TYPE_SYSTEM_OVERLAY

11

我正在尝试在系统覆盖视图上获取多个触摸事件,但只收到了 MotionEvent.ACTION_OUTSIDE 事件。

是否有可能在系统覆盖层上获得多个触摸事件?

任何示例或链接都将非常有帮助。

2个回答

26
创建一个悬浮视图时,设置LayoutParams 的类型为TYPE_SYSTEM_OVERLAY,并使用标志FLAG_WATCH_OUTSIDE_TOUCH。但这会产生一个问题,因为如Android文档所述:

您将无法收到完整的按下/移动/放开手势,只有第一次按下的位置作为ACTION_OUTSIDE

为了接收完整的触摸事件数组,需要使用TYPE_SYSTEM_ALERT类型,但这会导致覆盖层占据屏幕并停止与其他元素的交互。解决方法是同时使用TYPE_SYSTEM_OVERLAYTYPE_SYSTEM_ALERT,并根据需要更改LayoutParams的类型来在它们之间切换。
完成此操作的步骤如下:
  1. 监听ACTION_OUTSIDE运动事件。
  2. 当它发生时,测试是否发生在覆盖层内。
  3. 如果是,则将LayoutParams类型切换为TYPE_SYSTEM_ALERT
  4. 与覆盖层的交互完成后,请切换回TYPE_SYSTEM_OVERLAY
  5. 重复
需要记住的一件事是ACTION_OUTSIDE运动事件始终传递给屏幕上的其他元素。例如,如果覆盖层位于按钮上方,则该按钮也将接收到运动事件,无法停止它。
还要确保在清单文件中添加SYSTEM_ALERT_WINDOW权限。
完整的解决方案已在此发布:
http://www.jawsware.mobi/code_OverlayView/(已更新)
其中包括所有源代码和下载整个示例项目的链接。

Android 4.0更新 - 2013年1月3日


要创建一个覆盖视图时,在设置LayoutParams时,不要将类型设置为TYPE_SYSTEM_OVERLAY

而应该设置为TYPE_PHONE

使用以下标志:

FLAG_NOT_TOUCH_MODAL

FLAG_WATCH_OUTSIDE_TOUCH

FLAG_NOT_TOUCH_MODAL << 我发现这个很重要。如果没有它,焦点会给予覆盖层,软键(主页、菜单等)的按键事件就无法传递到下面的activity。

此外,上面的链接已更新以反映此更新。


1
感谢Jawsware的更新。但是,即使按照您的逻辑,我仍然无法在叠加层上看到多个触摸事件。我的意思是,如果您将第一个手指放在屏幕上,然后再放第二个和第三个手指(不要放开之前的手指),我们应该能够接收到触摸事件(即onTouch()应该被调用)。这有可能吗? - Ravs
1
但是我想要的是使用TYPE_SYSTEM_OVERLAY实现多点触控。这有可能吗? - Ravs
1
我不明白,因为你只会收到ACTION_OUTSIDE。你不会收到UP/DOWN/MOVE。我能想到的唯一解决方案是“触摸以激活...执行某些操作...手势/按钮以停用”。 - jawsware
1
是的,Jawsware,你说得对。我们只能使用TYPE_SYSTEM_OVERLAY接收ACTION_OUTSIDE。但是,在“TYPE_SYSTEM_OVERLAY”上是否有任何获取UP / DOWN / MOVE等事件的方法? - Ravs
TYPE_PHONE的工作方式类似于TYPE_SYSTEM_ALERT,它无法在布局下点击按钮,不像TYPE_SYSTEM_OVERLAY,在Android 4.4中... - sdyy
显示剩余2条评论

11

从Android 4.x开始,Android团队通过在 adjustWindowParamsLw() 函数中添加新功能来修复潜在的安全问题,该函数将为 TYPE_SYSTEM_OVERLAY 窗口添加 FLAG_NOT_FOCUSABLE、FLAG_NOT_TOUCHABLE 标志,并移除 FLAG_WATCH_OUTSIDE_TOUCH 标志。

这意味着,在ICS平台上,TYPE_SYSTEM_OVERLAY 窗口不会接收到任何触摸事件。

更新:2016/5/4 在 Android 4.0~4.3 上,TYPE_TOAST 无法接收触摸事件。与 TYPE_SYSTEM_OVERLAY 相同。在 Android 4.4+ 上,TYPE_TOAST 从排除列表中删除,因此可以使用 TYPE_TOAST 在 Android 4.4+ 设备上接收触摸事件。


1
这很有帮助!那么在 Android 4.0 之前,您建议我使用什么来代替 FLAG_WATCH_OUTSIDE_TOUCH 来实现相同的功能呢?是否应该实现另一个标志? - Brian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接