考虑这个假设的层次结构......
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 ,或手动将监听器附加到其所有子项?
最佳答案
ViewGroup
的 OnTouchListener
传入 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/