我正在尝试在系统覆盖视图上获取多个触摸事件,但只收到了 MotionEvent.ACTION_OUTSIDE
事件。
是否有可能在系统覆盖层上获得多个触摸事件?
任何示例或链接都将非常有帮助。
我正在尝试在系统覆盖视图上获取多个触摸事件,但只收到了 MotionEvent.ACTION_OUTSIDE
事件。
是否有可能在系统覆盖层上获得多个触摸事件?
任何示例或链接都将非常有帮助。
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
权限。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。
此外,上面的链接已更新以反映此更新。
从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+ 设备上接收触摸事件。
ACTION_OUTSIDE
。你不会收到UP/DOWN/MOVE。我能想到的唯一解决方案是“触摸以激活...执行某些操作...手势/按钮以停用”。 - jawsware