如何从MotionEvent获取底层视图?

时间:2011-05-23 03:28:56

标签: android

My GestureListener类在onSingleTap()或onFling()等方法中接收MotionEvent。有没有办法确定此事件的基础视图?

背景:我有一个包含许多子视图的LinearLayout。此LinearLayout上有一个触摸侦听器,可以调用手势检测器。因此,当用户在任何子视图上执行手势时,LinearLayout的手势检测器将接收MotionEvent。但问题是,因为有很多孩子,我需要确切地知道用户使用了哪个孩子。但我找不到将坐标转换为视图的方法。有没有办法做到这一点?

一个丑陋的解决方案:动态添加孩子。因此,我可以将所有子项保留在列表中,然后当MotionEvent出现时,我可以遍历列表并查看该点是否在子项内。但我不喜欢这个想法。还有更好的方法吗?

4 个答案:

答案 0 :(得分:3)

您确定要在布局上使用触控侦听器吗?为什么不让每个视图都有一个触摸监听器?

假设你有一堆需要翻转的开关。开关控制怪物。您可以让每个开关(您的视图)都有一个触摸侦听器,将开关传递给怪物。现在怪物可以用不同的方式处理每个视图。

这样的事情:

brightnessSwitch.setOnTouchListener( new View.OnTouchListener() {
  boolean onTouch(View v, MotionEvent event) {
    monster.toggleBrightness();
    return true;
  });

你甚至可以将MotionEvent传递给怪物。 (或者如果你想要一种类型的TouchListener,你可以将视图和事件都传递给怪物,但是你会丢失哪个开关的信息。)

答案 1 :(得分:1)

由于您在顶视图组上使用ontouchlistener(LinearLayout)来处理动作事件,如果ontouchlistener的返回值为true,则不会将偶数分派给任何其他目标。所以你可能需要使用丑陋的方法。我现在正忙着处理这个问题并发现它很烦人。

否则,根据需要为每个子视图设置ontouchlistener。

答案 2 :(得分:1)

如果可以,请在基本布局(线性或其他)上以及子视图下使用ListView或GridView。

则...

int pos = getGridView()。pointToPosition((int)me.getX(),(int)me.getY());

查看v = getGridView()。getChildAt(pos);

你也可以听孩子们仔细管理你在处理时返回的布尔值。

答案 3 :(得分:0)

给孩子一个id,并从父视图中使用parentView.findViewById(R.id.childviewid);