获取正在接收所有触摸事件的视图

时间:2011-07-19 04:03:16

标签: android events view touch overlay

我的系统覆盖图位于所有ActivitiesWindows之上。唯一的问题是它只能在用户将他/她放下屏幕时检测MotionEvents(它无法跟踪手指的移动或检测到手指抬起时)。作为一种可能的解决方案,我已经实现了第二个视图(我将其称为跟踪视图),该视图能够处理所有触摸事件,但保持隐藏,直到系统覆盖检测到所需位置的触摸为止;在那种情况下,它将调出跟踪视图。唯一的问题是,跟踪视图在用户将他/她的手指放回屏幕之前不会开始检测触摸事件。因此,为了解决这个问题,我想拦截获取触摸事件(即系统覆盖下的视图)的视图,并将其所有触摸事件转发到跟踪视图以进行处理。

有谁知道我如何获得接收所有触摸事件的视图并重定向它接收的所有触摸事件?

此问题涉及此question中使用的示例。

1 个答案:

答案 0 :(得分:6)

你无法完全按照自己的要求去做。输入系统非常小心地限制哪些窗口可以接收哪些事件;它故意不像其他系统,如Microsoft Windows,您可以参与低级事件调度,看看发生了什么。唯一允许的是:

  • 一个窗口,可以接收所有会发送到它的事件或其后面的任何窗口(不允许这些事件被其后面的窗口接收)。这被称为“触摸模式”。
  • 一个窗口,可以接收其矩形内的所有事件而不让它们进入窗口后面的窗口,但是矩形之外的事件可以转到它后面的相应窗口,而不会被它看到。这被称为“非触摸模式”。
  • “非触摸模式”的变体,允许仅告知其窗口外发生的向下事件。但是,它不会收到任何其他事件,并作为特殊操作代码提供:http://developer.android.com/reference/android/view/MotionEvent.html#ACTION_OUTSIDE

事件调度到窗口的另一个核心规则是,一旦选择了一个窗口作为触摸事件的目标,它将继续接收事件流直到最后一次。传统上在Android中,这将适用于触摸手势的所有其他手指(它接收所有手指,无论它们出现在何处,直到最后一根手指上升)。更新版本的平台允许您将此行为修改为具有多点触控功能:http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_SPLIT_TOUCH

因此,这些是您工具箱中的工具。您可以使用它们构建可能的内容,但这并不是为了允许您与事件系统进行任何可能的交互,因此会有限制。