【发布时间】:2011-12-25 19:20:03
【问题描述】:
我试图在系统覆盖视图上获取多个触摸事件,但我只收到MotionEvent.ACTION_OUTSIDE 事件。
有没有办法在系统覆盖上获取多个触摸事件?
任何示例或链接都会非常有帮助。
【问题讨论】:
标签: android events multi-touch
我试图在系统覆盖视图上获取多个触摸事件,但我只收到MotionEvent.ACTION_OUTSIDE 事件。
有没有办法在系统覆盖上获取多个触摸事件?
任何示例或链接都会非常有帮助。
【问题讨论】:
标签: android events multi-touch
要创建覆盖视图,在设置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
此外,之前的链接(上方)已更新以反映此次更新。
【讨论】:
TYPE_SYSTEM_OVERLAY 状态下不会收到多点触控信息。一旦切换到TYPE_SYSTEM_ALERT(即在覆盖层内按下后抬起手指),您应该会收到多点触控事件。我将\nPOINTERS: " + event.getPointerCount() 附加到示例中的每个info.setText 调用中,当我触摸\抬起手指时指针计数会增加\减少。第一次down后,我只收到了move事件,但是指针计数还是变了。
ACTION_OUTSIDE。您不会收到 UP/DOWN/MOVE。我能想出的唯一解决方案是触摸激活...做某事...取消激活的手势/按钮。
从 Android 4.x 开始,Android 团队 Android 团队修复了一个潜力 通过添加一个新函数 adjustWindowParamsLw() 来解决安全问题 将为 TYPE_SYSTEM_OVERLAY 窗口添加 FLAG_NOT_FOCUSABLE、FLAG_NOT_TOUCHABLE 并删除 FLAG_WATCH_OUTSIDE_TOUCH 标志。
那是 TYPE_SYSTEM_OVERLAY 窗口在 ICS 平台上不会收到任何触摸事件。
更新日期:2016 年 5 月 4 日 TYPE_TOAST 在 Android 4.0~4.3 上无法接收触摸事件。它与 TYPE_SYSTEM_OVERLAY 相同。在 Android 4.4+ 上,TYPE_TOAST 从排除列表中删除,因此您可以使用 TYPE_TOAST 在 Android 4.4+ 设备上接收触摸事件。
【讨论】: