我试图理解Android如何处理触摸事件并且有点困惑。根据我的理解,触摸事件被发送到根视图并传递给孩子们。
我有一个FrameLayout
,它是Fragment
的容器。
第一个片段视图是ScrollView
,第二个是某种Gallery
(HorizontalListView),最后一个也是FrameLayout
。每次布局中只有一个片段。
我想要做的是识别屏幕上的用户滑动,以供应用程序使用。我想计算滑动并在经过一些滑动后做一些事情。
我尝试在OnTouchListener
顶部放置一个FrameLayout
,但当孩子是ScrollView
或Gallery
时,它不会被调用。我试图在false
的末尾返回true
和onTouch
,但我得到相同的结果 - 它永远不会被调用。
我该怎么办? 我只想“透明地”处理触摸事件并传递它们,就像我甚至没有触摸它们一样。
答案 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
等)