在ViewGroup中处理事件时,您能确定触摸了哪个子视图吗?

时间:2017-07-20 14:35:44

标签: java android ontouchevent viewgroup

考虑这个假设的等级......

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

我想要知道的是哪个(大)子视图被触及并在LinearLayoutA中处理它。此外,我不控制这些视图,所以我不能简单地让他们在内部处理触摸并委托给他们的父母。

目前我手动将触摸侦听器添加到CustomViews 1-3,但这需要大量的“样板”工作,这也意味着如果有人点击SomeViewX或SomeOtherViewY,我将不会得到通知,只有我特定的那些将听众附加到。

现在使用其他语言,例如带有WPF的C#,如果你处理相当于LinearLayoutA的事件,事件有效负载的一部分是一个源,这是启动触摸的视图,但我不知道任何在Android中这样的事情。

我看到的所有例子都需要循环遍历孩子并对其进行测试,然后如果存在重叠则通过z顺序消除歧义,并且当您确定了一个孩子时,那么您必须经历其子女并重复。

那么,是否存在内置或“Androidy”方式来了解ViewGroup中哪个子节点被触摸而无需手动迭代和命中测试,或手动将侦听器附加到其所有子节点?

1 个答案:

答案 0 :(得分:0)

OnTouchListener的{​​{1}}在ViewGroup中作为ViewGroup参数传递,而不是View中实际触及的孩子。由于您无法控制布局中View的来源,因此您必须从其外部手动添加View

正如我的评论中所提到的,您可以通过将其附加到您想要监听的每个OnTouchListener来为所有View重用相同的侦听器。如果您动态添加这些View,那么在创建它们时也可以轻松调用View

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