安卓 : Multi touch and TYPE_SYSTEM_OVERLAY

标签 android events multi-touch

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

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

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

最佳答案

要创建叠加 View ,在设置 LayoutParams 时,您需要将类型设置为 TYPE_SYSTEM_OVERLAY 并使用标志 FLAG_WATCH_OUTSIDE_TOUCH。这会带来一个问题,因为正如 Android 文档所述:

you will not receive the full down/move/up gesture, only the location of the first down as an 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 运动事件总是传递给屏幕上的其余元素。因此,例如,如果叠加层位于按钮之上,则该按钮也会接收到 Action 事件,并且无法停止它。

还要确保将 SYSTEM_ALERT_WINDOW 权限添加到 mainifest 文件。

我在这里发布了完整的解决方案:
http://www.jawsware.mobi/code_OverlayView/ (已更新)

它包括所有源代码和一个下载整个示例项目的链接。


Android 4.0 更新 - 1/3/2013


要创建叠加 View ,在设置布局参数时不要将类型设置为TYPE_SYSTEM_OVERLAY

而是将其设置为 TYPE_PHONE

使用以下标志:

FLAG_NOT_TOUCH_MODAL

FLAG_WATCH_OUTSIDE_TOUCH

FLAG_NOT_TOUCH_MODAL << 我发现这个非常重要。没有它,焦点将被赋予叠加层并且软键(主页、菜单等)按下不会传递到下面的 Activity 。

此外,之前的链接(上方)已更新以反射(reflect)此更新。

关于安卓 : Multi touch and TYPE_SYSTEM_OVERLAY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8073803/

相关文章:

Android - Facebook 登录仅在第一次导致 onResume 错误

android - Android-x86 4.3音频

android - 对话框有圆角但没有透明边缘

javascript - jQuery 只绑定(bind)到 keyup,而不是焦点

iphone - 如何确定多点触控场景中最后一次触摸的x&y?

javascript - D3.js缩放和触摸设备平滑度

macos - 在 OS X 中生成和发布多点触控事件以使用外部摄像头控制 Mac

android - GoogleMaps 标记的 GeoMapping 方位角和坐标计算

javascript - 检测 iframe 何时开始加载新 URL

javascript - VueJS 发出的事件未被同一层次结构中的其他组件捕获