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

时间:2012-08-28 22:11:51

标签: android android-layout click touch ontouchevent

我试图理解Android如何处理触摸事件并且有点困惑。根据我的理解,触摸事件被发送到根视图并传递给孩子们。 我有一个FrameLayout,它是Fragment的容器。 第一个片段视图是ScrollView,第二个是某种Gallery(Horizo​​ntalListView),最后一个也是FrameLayout。每次布局中只有一个片段。 我想要做的是识别屏幕上的用户滑动,以供应用程序使用。我想计算滑动并在经过一些滑动后做一些事情。

我尝试在OnTouchListener顶部放置一个FrameLayout,但当孩子是ScrollViewGallery时,它不会被调用。我试图在false的末尾返回trueonTouch,但我得到相同的结果 - 它永远不会被调用。

我该怎么办? 我只想“透明地”处理触摸事件并传递它们,就像我甚至没有触摸它们一样。

1 个答案:

答案 0 :(得分:26)

我的理解是,它实际上是另一个方向。子视图首先触发事件(有点)。根视图得到它的dispatchTouchEvent()被调用,它将事件传播到子项的onTouchEvent(),然后,根据它们是返回true还是false,调用父项onTouchEvent()

拦截这类事情的正常解决方法是在一个人的活动中覆盖dispatchTouchEvent(MotionEvent ev),如下所示:

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

此文档的文档为here。请注意,您还可以在任何ViewGroup中覆盖该方法(例如FrameLayout等)