我正在尝试在系统覆盖视图上获取多个触摸事件,但我只收到MotionEvent.ACTION_OUTSIDE
事件。
是否有可能在系统覆盖上获取多个触摸事件?
任何示例或链接都会非常有用。
答案 0 :(得分:25)
要创建叠加层视图,在设置LayoutParams
时,您需要将类型设置为TYPE_SYSTEM_OVERLAY
并使用标记FLAG_WATCH_OUTSIDE_TOUCH
。这提出了一个问题,因为Android文档声明:
您不会收到完整的向下/移动/向上手势,只会将第一个向下的位置收到
ACTION_OUTSIDE
。
为了接收完整的触摸事件,您需要使用TYPE_SYSTEM_ALERT
类型,但这会导致叠加层接管屏幕并停止与其他元素的交互。解决方案是同时使用TYPE_SYSTEM_OVERLAY
和TYPE_SYSTEM_ALERT
,并根据需要通过更改LayoutParams
的类型来切换它们。
这是通过以下方式完成的:
ACTION_OUTSIDE
动议事件。LayoutParams
类型切换为TYPE_SYSTEM_ALERT
TYPE_SYSTEM_OVERLAY
要记住的一件事是ACTION_OUTSIDE
运动事件总是传递给屏幕上的其他元素。因此,例如,如果叠加层位于按钮的顶部,则该按钮也会收到动作事件,并且无法阻止它。
还要确保将SYSTEM_ALERT_WINDOW
权限添加到mainifest文件中。
我在这里发布了完整的解决方案:
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
<<我发现这个非常重要。没有它,重点是叠加和软键(主页,菜单等)按下不会传递给下面的活动。
此外,上一个链接(上方)已更新以反映此更新。
答案 1 :(得分:10)
TYPE_SYSTEM_OVERLAY窗口不会在ICS平台上收到任何触摸事件。
更新时间:2016/5/4 在Android 4.0~4.3上,TYPE_TOAST无法接收触摸事件。它与TYPE_SYSTEM_OVERLAY相同。在Android 4.4及更高版本中,TYPE_TOAST已从排除列表中删除,因此您可以使用TYPE_TOAST在Android 4.4及其设备上接收触摸事件。