首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android overlay来抓取所有的触控,并将它们传递?

Android overlay来抓取所有的触控,并将它们传递?
EN

Stack Overflow用户
提问于 2012-02-01 02:39:29
回答 4查看 25.2K关注 0票数 28

我基本上是试图从系统覆盖的东西中获取所有的触摸事件数据,基于这些触摸数据移动我的精灵,然后允许OS/homescreen/browser按照它应该的方式操作这些数据(反之亦然)。我也发现了类似的问题,但没有什么能让我找到我没有去过的地方:

Getting the View that is receiving all the touch events

(已实现,结果如下) Creating a system overlay window (always on top)

我能做什么:

我可以抓取所有的触摸事件并通过移动精灵来处理它们,而不允许OS/homescreen/browser看到它们中的任何一个,或者我可以允许触摸事件通过并只获得一个“TOUCH_OUTSIDE”,让我的应用程序执行操作。

我未曾实现的目标:

我无论如何也想不出一种让两者都能处理数据的方法。我能想到的唯一不能实现的方法是:截取我应用程序中的数据,并将其传递到OS/homescreen/browser,以允许OS/homescreen/browser首先获取数据,然后以某种方式获得一个带有信息的回调,允许OS/homescreen/browser获取数据,对数据进行操作,并轮询它们的滚动/位置值,以便在我的应用程序中对其进行操作。

我担心这是不可能的,我想我在一些文档中读到了一些我现在找不到的东西:“要么全有要么什么都没有,要么你的视图得到所有的事件,要么一个都没有。”

(为了避免混淆,我并不是说我有两个视图。我的意思是,我有一个视图,通过覆盖OS/homescreen/browser的活动/服务控制。如果你愿意,就像一块玻璃。)

感谢您提供的任何有用的信息,非常感谢!

为了避免混淆,更新在下面发布了我自己的文档。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-02 03:30:23

我找到了这个文档,它很大程度上说明不可能同时做到这两点:Android : Multi touch and TYPE_SYSTEM_OVERLAY

他们讨论了变通方法,但我认为他们中的任何一个实际上都不会真正实现我想要做的事情。两者都将事件提供给底层应用程序,并且能够窥探它们来为我自己采取行动。

要创建覆盖视图,在设置LayoutParams时,您需要将类型设置为TYPE_SYSTEM_OVERLAY并使用标志FLAG_WATCH_OUTSIDE_TOUCH。这带来了一个问题,因为正如安卓文档所述:“您将不会收到完整的向下/移动/向上手势,只会收到第一个向下的位置作为一个ACTION_OUTSIDE。”为了接收完整的触摸事件数组,您需要使用TYPE_SYSTEM_ALERT类型,但这会导致overlay占据屏幕并停止与其他元素的交互。

任何人不同意我都希望听到好消息:-D

票数 17
EN

Stack Overflow用户

发布于 2012-02-01 05:09:38

你可以使用GestureOverlayView,如果你想隐藏它绘制的线条,你可以将颜色设置为透明#00000000,这样它就不会显示出来,然后你就可以捕捉所有的触摸和手势。

http://developer.android.com/resources/articles/gestures.html

票数 2
EN

Stack Overflow用户

发布于 2018-02-12 08:02:30

我也在找同样的东西。

这个标志对我很有用,FLAG_NOT_TOUCH_MODAL

在Android 7和8设置上的工作方式如下。

到目前为止,我实现的唯一操作是触摸关闭覆盖窗口。

我还使用了这里的Example System Overlay Code on Github中的代码,这是获取事件所需的。

顺便说一句,谷歌地图在Android 8上做得非常好,你可以拖动覆盖窗口,调整窗口大小,或者关闭窗口。所有其他应用程序在运行时都可以正常运行。

代码语言:javascript
复制
    var type = 0

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O)
    {
        type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
    }
    else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
    {
        type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
    }

    var flags = FLAG_NOT_TOUCH_MODAL

    mOverlayLayoutParams = WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, type, flags, PixelFormat.TRANSLUCENT)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9085022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档