关于Touch事件传递机制网上很多说的都不够清晰(也可能是我没找到,哈哈),今天就简单写一下,主要就看流程图就成了
流程图:

说明:
当手指触摸屏幕时, 首先触发顶层ViewGroup的dispatchTouchEvent方法,在此方法中会先调用onInterceptTouchEvent方法:
- 如果onInterceptTouchEvent返回true,则不再向下分发事件,并调用ViewGroup的父类View的dispatchTouchEvent方法,查看源码得知会先执行onTouchListener的onTouch方法,如果此方法返回false,则会调用onTouchEvent方法,如果返回true则直接返回;
- 如果onInterceptTouchEvent返回false,则事件向下分发,调用子View的dispatchTouchEvent方法; 如果子View不是ViewGroup,在此方法中实际执行的是onTouchListener的onTouch方法,如果onTouch方法返回true则直接返回不再执行子View的onTouchEvent方法(包括onClick等),且后续的MOVE和UP事件都由子View的onTouch方法消费掉,且不再向上传递;如果onTouch方法返回false,则会调用子View的onTouchEvent方法,此时会调用onClick方法等,如果onTouchEvent返回true,则后续的MOVE和UP事件都由子View的onTouchEvent方法消费掉,当然也会走onTouch方法,如果onTouchEvent返回false,则事件向上传递,且后续事件不再传递给子View;如果子View是一个ViewGroup则按以上说明重新走一遍;
- 如果所有的子View都返回false,则后续的所有事件都由顶层ViewGroup执行消费掉;
网友评论