Android:多点触控和TYPE_SYSTEM_OVERLAY

Rav*_*avs 9 events android multi-touch

我试图在系统覆盖视图上获得多个触摸事件,但我只接收 MotionEvent.ACTION_OUTSIDE事件.

是否有任何可能的方法在系统覆盖上获得多个触摸事件?

任何示例或链接都会非常有用.

jaw*_*are 25

要创建叠加视图,在设置时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权限添加到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<<我发现这个非常重要.没有它,重点是叠加和软键(主页,菜单等)按下不传递给下面的活动.

此外,上一个链接(上面)已更新以反映此更新.


Sam*_* Lu 10

从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+设备上接收触摸事件.