我在这里问了一个已回答的问题:
How to vary between child and parent view group touch events
parent (drawer) ontouchevent 被解雇,而不是 child、listview。
我在这里也回答了类似的问题:
https://stackoverflow.com/a/28180281/3956566
您需要管理您的触摸事件,以便由孩子处理。您需要使用 onInterceptTouchEvent 并返回 false。
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// returning false means the child will handle the touch event.
return false;
}
然后您管理您touchevent 的列表视图:
@Override
public boolean onTouchEvent(MotionEvent ev) {
// This method will only be called if the touch event was intercepted in
// onInterceptTouchEvent
// TODO Select your listview item.
}
您还可以确定正在发生什么类型的触摸事件,例如滚动,并确定是子级还是父级来管理事件。
Managing Touch Events in a ViewGroup
我在Understanding Android Input Touch Events System Framework (dispatchTouchEvent, onInterceptTouchEvent, onTouchEvent, OnTouchListener.onTouch)添加了这句话:
根视图开始将事件分派给它的子视图。让我们
假设我们有这个层次结构:
A – ViewGroup1(B 的父级)。
B – ViewGroup2(C 的父级)。
C – 视图(B 的子级)
– 接收触摸/点击/点击。现在根视图将调用
A.dispatchTouchEvent()。现在 ViewGroup.dispatchEvent() 的工作
(not View.dispatchEvent()) 是找出所有的子视图和视图
边界包含触摸点坐标的组(使用命中
测试算法)。当它计算出相关孩子的名单时,
它开始通过调用他们的事件向他们发送事件
dispatchTouchEvent().
这是一个重要的部分。在 dispatchTouchEvent() 之前
调用孩子, A.dispatchTouchEvent() 将首先调用
A.onInterceptTouchEvent() 查看视图组是否有兴趣
拦截事件并自行处理后续手势
(滚动是一个很好的用例,其中 B 上的一扔应该导致
在 A) 上滚动。方法 onInterceptTouchEvent() 仅可用
在视图组(因为他们是可以成为父母/容器的人)
拦截触摸事件的要求)可以保持一个
关注事件并通过返回 true 来劫持它。如果返回 false
然后调度照常继续,即 B.dispatchTouchEvent()
(孩子)将被调用。但在返回 true 时,会发生以下情况:
ACTION_CANCEL 将发送给所有孩子。
所有的
随后的手势事件(直到 ACTION_UP/ACTION_CANCEL)将
由事件侦听器 (OnTouchListener.onTouch()) 使用,如果
已定义,否则为 A 级别的事件处理程序 A.onTouchEvent()。
A.onInterceptTouchEvent() 本身将永远不会被再次调用。
With this diagram:
如果您需要更多解释,请告诉我。