通过父级捕获onTouch事件,处理并传递给子元素。

21

我试图理解Android如何处理触摸事件,但有些困惑。据我所知,触摸事件被发送到根视图并向下传递到子视图。

我有一个FrameLayout作为Fragment的容器。第一个片段视图是一个ScrollView,第二个是某种Gallery(HorizontalListView),最后一个也是FrameLayout。每次布局中只有一个片段。

我想要做的是识别用户在屏幕上的滑动手势,以便用于应用程序。我希望计数滑动次数,并在某些滑动次数后执行某些操作。

我尝试在顶部的FrameLayout上放置一个OnTouchListener,但当子项为ScrollViewGallery时,它不会被调用。我尝试在onTouch的结尾处返回falsetrue,但结果相同-它永远不会被调用。

我该怎么做呢? 我只想“透明地”处理触摸事件并像我从未触碰它们一样传递它们。

1个回答

28

我的理解是实际上是反过来的。子视图首先触发它们的事件(有点像)。根视图会调用它的dispatchTouchEvent(),将事件向下传播到子视图的onTouchEvent(),然后根据它们返回的true或false值,调用父视图的onTouchEvent()

截取这种情况的正常解决方案是在活动中重写dispatchTouchEvent(MotionEvent ev),如下所示:

@Override
public boolean dispatchTouchEvent (MotionEvent ev) {
  // Do your calcluations
  return super.dispatchTouchEvent(ev);
}

这个的文档可以在这里找到。注意,你也可以在任何ViewGroup(比如FrameLayout等)中覆盖该方法。


成功了!我扩展了FrameLayout,覆盖了你提到的方法,并将MotionEvent发送到GestureDetector。所有这些都有点令人困惑。谢谢! - Elad92
@Elad92,就像你提到的那样,你能帮我修改这个2D滚动代码吗?https://gist.github.com/LOG-TAG/0505eedccef9e00821da 我不太清楚如何将MotionEvent发送到GestureDetector。 - LOG_TAG
因此,在父类中可能不会使用onTouchEvent(MotionEvent me) - CrandellWS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接