【问题标题】:Android : Multi touch and TYPE_SYSTEM_OVERLAYAndroid:多点触控和 TYPE_SYSTEM_OVERLAY
【发布时间】:2011-12-25 19:20:03
【问题描述】:

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

有没有办法在系统覆盖上获取多个触摸事件?

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

【问题讨论】:

    标签: android events multi-touch


    【解决方案1】:

    要创建覆盖视图,在设置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

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

    【讨论】:

    • 感谢 Jawsware 的更新。但是根据您的逻辑,我也无法在叠加层上看到多个触摸事件。我的意思是,如果您将第一根手指放在屏幕上,然后是第二根手指,然后是第三根手指(不抬起之前的手指),我们应该能够接收触摸事件(即 onTouch() 应该被调用)。有可能吗?
    • 您在TYPE_SYSTEM_OVERLAY 状态下不会收到多点触控信息。一旦切换到TYPE_SYSTEM_ALERT(即在覆盖层内按下后抬起手指),您应该会收到多点触控事件。我将\nPOINTERS: " + event.getPointerCount() 附加到示例中的每个info.setText 调用中,当我触摸\抬起手指时指针计数会增加\减少。第一次down后,我只收到了move事件,但是指针计数还是变了。
    • 但我想要的实际上是使用 TYPE_SYSTEM_OVERLAY 进行多点触控。这可能吗?
    • 我不知道怎么做,因为你只收到ACTION_OUTSIDE。您不会收到 UP/DOWN/MOVE。我能想出的唯一解决方案是触摸激活...做某事...取消激活的手势/按钮。
    • 是的,你是对的 Jawsware。我们只能接收带有 TYPE_SYSTEM_OVERLAY 的 ACTION_OUTSIDE。但是有什么方法可以在“TYPE_SYSTEM_OVERLAY”上获得 UP/DOWN/MOVE 等类型的事件?
    【解决方案2】:

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

    【讨论】:

    • 这很有帮助!那么你有什么建议我在 Android 4.0 之前使用而不是 FLAG_WATCH_OUTSIDE_TOUCH 来实现相同的功能。是否应该实施另一个标志?
    猜你喜欢
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    相关资源
    最近更新 更多