我试图在系统覆盖 View 上获取多个触摸事件,但我只收到 MotionEvent.ACTION_OUTSIDE
事件。
是否有任何可能的方法在系统覆盖上获取多个触摸事件?
任何示例或链接都会非常有帮助。
最佳答案
要创建叠加 View ,在设置 LayoutParams
时,您需要将类型设置为 TYPE_SYSTEM_OVERLAY
并使用标志 FLAG_WATCH_OUTSIDE_TOUCH
。这会带来一个问题,因为正如 Android 文档所述:
you will not receive the full down/move/up gesture, only the location of the first down as an
ACTION_OUTSIDE
.
为了接收完整的触摸事件数组,您需要使用 TYPE_SYSTEM_ALERT
类型,但这会导致覆盖层接管屏幕并停止与其他元素的交互。解决方案是同时使用 TYPE_SYSTEM_OVERLAY
和 TYPE_SYSTEM_ALERT
并根据需要通过更改 LayoutParams
的类型在它们之间切换。
这是通过以下方式实现的:
- 注意
ACTION_OUTSIDE
运动事件。 - 发生时,测试它是否发生在叠加层内。
- 如果是,请将
LayoutParams
类型切换为TYPE_SYSTEM_ALERT
- 与叠加层的交互完成后,切换回
TYPE_SYSTEM_OVERLAY
- 重复
要记住的一件事是 ACTION_OUTSIDE
运动事件总是传递给屏幕上的其余元素。因此,例如,如果叠加层位于按钮之上,则该按钮也会接收到 Action 事件,并且无法停止它。
还要确保将 SYSTEM_ALERT_WINDOW
权限添加到 mainifest 文件。
我在这里发布了完整的解决方案:
http://www.jawsware.mobi/code_OverlayView/ (已更新)
它包括所有源代码和一个下载整个示例项目的链接。
Android 4.0 更新 - 1/3/2013
要创建叠加 View ,在设置布局参数时不要将类型设置为TYPE_SYSTEM_OVERLAY
。
而是将其设置为 TYPE_PHONE
。
使用以下标志:
FLAG_NOT_TOUCH_MODAL
FLAG_WATCH_OUTSIDE_TOUCH
FLAG_NOT_TOUCH_MODAL
<< 我发现这个非常重要。没有它,焦点将被赋予叠加层并且软键(主页、菜单等)按下不会传递到下面的 Activity 。
此外,之前的链接(上方)已更新以反射(reflect)此更新。
关于安卓 : Multi touch and TYPE_SYSTEM_OVERLAY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8073803/