【问题标题】:How to make overlay receive touch events without consuming the touch for the other apps?如何让叠加层接收触摸事件而不消耗其他应用程序的触摸?
【发布时间】:2019-09-23 07:01:13
【问题描述】:

我目前正在尝试制作一个类似于 Facebook Messenger 聊天头的实用程序叠加层,您可以在其中在屏幕上移动视图。单击视图时,它会展开为更复杂的布局。但是,问题是如果我将 LayoutParams 的标志设置为WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,后面的应用程序会接收到触摸事件,而我的叠加层根本不会接收到任何触摸事件。但是,如果我删除该标志,则覆盖层会接收触摸,但会阻止触摸。这意味着我什至无法打开应用程序抽屉,因为触摸被阻止了。

我使用全屏透明 Activity 作为背景,因此我可以在其周围移动我的覆盖“小部件”。

有什么办法可以让它不阻止触摸事件。即使我没有将其设置为全屏,只要我没有 FLAG_NOT_TOUCHABLE 标志,我的叠加层就会完全阻止所有屏幕触摸。

【问题讨论】:

  • 它不适用于透明 Activity。气泡的实现方式(在 Android Q 中的 Bubbles API 之前)是将视图直接附加到 WindowManager。见this answerthis repo
  • 一个触摸遍历每个函数覆盖一些触摸事件。它从顶层开始,一直走到底层。如果您想阻止触摸,您可以在任何这些功能中使用return false;。如果您不想阻止它,请在这些函数中使用return true;
  • @kenny_k 所以如果我将视图直接附加到 WindowManager,我还能移动它吗?顺便说一句,问题仍然存在。我放弃了全屏透明活动,但我仍然得到相同的结果。这就是我制作布局参数的方式:WindowManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, PixelFormat.TRANSLUCENT)
  • 我猜你应该删除WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE - 因为它显然是不可触摸的。由于您不再有活动,因此您视图之外的任何 TouchEvent 都将由触摸下方的任何内容处理。
  • @kenny_k 结果相同。如果我删除不可触摸标志,视图变为可点击,但下面的应用程序无法再次接收触摸事件

标签: java android kotlin


【解决方案1】:

请删除此标志

WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE 

带有这个标志

WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE

查看此链接https://medium.com/@kevalpatel2106/create-chat-heads-like-facebook-messenger-32f7f1a62064

【讨论】:

    猜你喜欢
    • 2018-01-19
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    相关资源
    最近更新 更多