My GestureListener类在onSingleTap()或onFling()等方法中接收MotionEvent。有没有办法确定此事件的基础视图?
背景:我有一个包含许多子视图的LinearLayout。此LinearLayout上有一个触摸侦听器,可以调用手势检测器。因此,当用户在任何子视图上执行手势时,LinearLayout的手势检测器将接收MotionEvent。但问题是,因为有很多孩子,我需要确切地知道用户使用了哪个孩子。但我找不到将坐标转换为视图的方法。有没有办法做到这一点?
一个丑陋的解决方案:动态添加孩子。因此,我可以将所有子项保留在列表中,然后当MotionEvent出现时,我可以遍历列表并查看该点是否在子项内。但我不喜欢这个想法。还有更好的方法吗?
答案 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);