java - 在处理ViewGroup中的事件时,你能确定哪个 subview 被触摸了吗?

标签 java android touch-event viewgroup

考虑这个假设的层次结构......

LinearLayoutA <-- I want to handle the touches here...
  |
  +-SomeViewX
  +-SomeOtherViewY
  +-LinearLayoutB
      |
      +-CustomView1 <-- for these three CustomView objects
      +-CustomView2
      +-CustomView3

我想做的是知道哪个(大) subview 被触摸并从 LinearLayoutA 中处理它。另外,我不控制这些 View ,因此我不能简单地让它们在内部处理触摸并委托(delegate)给它们的父级。

目前,我正在手动将触摸监听器添加到 CustomViews 1-3,但这需要大量的“样板”工作,并且还意味着如果有人点击 SomeViewX 或 SomeViewX 或 SomeViewY,我不会收到通知,只有我附加了监听器的特定监听器。

现在在其他语言中,例如使用 WPF 的 C#,如果您以与 LinearLayoutA 等效的方式处理事件,则事件有效负载的一部分是源,即启动触摸的 View ,但我不知道 Android 中存在任何此类情况。

我见过的所有示例都需要循环遍历子项并对其进行 HitTest ,然后如果存在重叠,则通过 z 顺序消除歧义,当您识别出一个子项时,您必须遍历其子项并重复。

那么,是否有一种内置的或“Androidy”方法可以知道 ViewGroup 中的哪个子项被触摸,而无需手动迭代和 HitTest ,或手动将监听器附加到其所有子项?

最佳答案

ViewGroupOnTouchListener 传入 ViewGroup 作为其 View 参数,而不是实际触摸的 View 中的子级。由于您无法控制布局中 View 的源,因此您必须从它们外部手动添加 OnTouchListener

正如我的评论中提到的,您可以通过将相同的监听器附加到您想要监听的每个 View 来为所有 View 重用该监听器。如果您要动态添加这些 View,那么在创建它们时调用它们的 setOnTouchListener() 应该很简单。

有关该主题的更多信息,请查看 Android's guide to managing touch events in a ViewGroup它为父级提供了一种拦截子级触摸事件的方法,但反之则不然。

关于java - 在处理ViewGroup中的事件时,你能确定哪个 subview 被触摸了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45217798/

相关文章:

java - 如何修复 onActivityResult 之后 JNI 代码内的 Android 崩溃?

java - Envers - 显示具有关系的审计数据

javascript - 检测另一个功能上的 mousedown 和 touchstart pageX

android - 如何在 SurfaceView 上实现项目触摸

java - 同一个 Java 类中的 Try-Catch-Throw

java - 如何强制弹出 Android 键盘?

android - 使用 Spock 和 Java 8 运行 Android 应用程序的问题

Android NFC writeNdefMessage 抛出 IOException Tag is not ndef

android - Android 按位运算符

java - java - 如何在不使用循环和递归的情况下打印数组