事件分发机制和事件传递机制
1. 触屏事件先传递给父容器的onInterceptTouchEvent方法(注:非容器没有onInterceptTouchEvent方法,可以把事件比作运货的车子,onInterceptTouchEvent比作是一个土匪关卡)
return true,事件被拦截,事件直接传递给父容器的onTouchEvent,此次事件与子控件无关,因此onInterceptTouchEvent不会继续接收到ACTION_MOVE,ACTION_UP事件
return false,事件优先传递给子控件处理
2. 子控件onTouchEvent接收到ACTION_DOWN事件,
return true 子控件消费事件,事件不向上回传,关卡没有拦截,后续每次都要从关卡过,即父容器onInterceptTouchEvent会继续接收到ACTION_MOVE,ACTION_UP事件,
子控件的onTouchEvent也会陆续接收到ACTION_MOVE,ACTION_UP事件
return false 子控件不处理,事件向上回传父控件,第一次来关卡虽然没有拦截,但是子控件第一次就声明不处理,下次车子也不用再来关卡了,
即父容器onInterceptTouchEvent不会继续接收到ACTION_MOVE,ACTION_UP事件,子控件的onTouchEvent更不可能接收到ACTION_MOVE,ACTION_UP事件
3. 父控件onTouchEvent接收到ACTION_DOWN事件后
return true 父控件消费事件,不再向上传递,onTouchEvent会陆续接收到ACTION_MOVE,ACTION_UP事件,事件不会向下传递,也就不关onInterceptTouchEvent什么事了
return false 父控件不处理,事件向上回传父控件,onTouchEvent不会接收到ACTION_MOVE,ACTION_UP事件,这种情况是全部默认,即父容器不拦截,也不处理,自控件也不处理,事件传了三次就走了,也不会回来了。
4. 根据dispatchTouchEvent方法源码可知onTouchListener优先于onTouchEvent
总结:
1. 要让父控件处理触屏事件,必须满足:
只需要onInterceptTouchEvent方法return true,父控件onTouchEvent return true;
或者onInterceptTouchEvent方法return false,子控件onTouchEvent return false,父控件onTouchEvent return true;
若是有onTouchListener监听,onTouch方法必须返回false。
2. 要让子控件处理触屏事件,必须满足:
父控件onInterceptTouchEvent方法默认return super.onInterceptTouchEvent(ev)或者直接return false,
子控件onTouchEvent方法 return true;
若是有onTouchListener监听,onTouch方法必须返回false。

浙公网安备 33010602011771号