Android:多点触控和TYPE_SYSTEM_OVERLAY

时间:2011-11-10 00:59:14

标签: android events multi-touch

我正在尝试在系统覆盖视图上获取多个触摸事件,但我只收到MotionEvent.ACTION_OUTSIDE事件。

是否有可能在系统覆盖上获取多个触摸事件?

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

2 个答案:

答案 0 :(得分: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. 重复
  6. 要记住的一件事是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)

从Android 4.x开始,Android团队Android团队确定了潜力 安全问题通过在其中添加一个新函数adjustWindowParamsLw()来实现 将添加FLAG_NOT_FOCUSABLE,FLAG_NOT_TOUCHABLE并删除TYPE_SYSTEM_OVERLAY窗口的FLAG_WATCH_OUTSIDE_TOUCH标志。

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及其设备上接收触摸事件。