事件分发机制和事件传递机制


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。

posted @ 2015-11-27 23:02  屌丝大叔  阅读(494)  评论(0)    收藏  举报