1.ViewGroup:onTouchEvent与onTouch事件与onClick事件的关系
流程:dispatchTouchEvent—》onInterceptTouchEvent—》onTouchListenter(onTouch)—》onTouchEvent—》onClick
1.若onTouchListener:onTouch返回 true:
则dispatch(down)—》onIntercept--》onTouch(down)—》dispatch(up)—》onTouch(up)
2.若onTouchListener:onTouch返回 false:
则dispatch(down)—》onIntercept(down)—》onTouch(down)--》onTouchEvent(down)—》dispatch(up)—》onTouch(up)—》onTouchEvent(up)—》onClick();
image.png
综上:整个事件分发的入口为dispatchTouchEvent,整个过程,有onInterceptTouchEvent(ViewGroup),onTouchListener,onTouchEvent,onClickListener参与,而onTouchListener的返回值为true时,onTouchEvent以及onClick不会被调用,onTouchListener返回false时,onTouchEvent以及onClick会被调用(前提是onTouchEvent返回值为false,clickable以及设置了onClickListener)
2.onTouchEvent消费规则:
2.1若down事件返回了false,则后续的move,up事件均不会在分发至此View(ViewGroup),因为该View(ViewGroup)不消费该事件(down返回了false)
false.png
2.2.若down返回了true
true
2.3.down返回了super
super
2.4若layout中包含子view,而layout的onTouchEvent返回了true,子 view还能响应touch事件吗?(答案是可以的,没搞懂,layout不是已经消费了吗?)
3.onInterceptTouchEvent拦截规则:
1.若layout的onInterceptTouchEvent()返回了true,则该layout的onTouchEvent只能继续接收到down事件,后续的move,up事件接受不到(没搞懂)
2.若layout的onInterceptTouchEvent返回了false,则该layout及其子view的事件分发均按正常逻辑分发
网友评论