ViewGroup的事件分发主要有三个方法:
//负责分发事件
dispatchTouchEvent(MotionEvent ev)
//负责拦截事件
onInterceptTouchEvent(MotionEvent ev)
//负责消费事件
onTouchEvent(MotionEvent ev)
主要分析dispatchTouchEvent和onTouchEvent方法
U型事件流程图
假设当前activity中有一个ViewGroup,叫第一层容器,第一层容器这个ViewGroup中还有一个ViewGroup,叫第二层容器,第二层容器中有一个View,叫子view
事件从红色的第一层容器的dispatchTouchEvent方法开始分发 此时U型事件流在顶层
接下来就到了第二层容器的dispatchTransformedTouchEvent方法中
因为第三层子View是一个View,所以会执行View的dispatchTouchEvent方法,接下来看View的dispatchTouchEvent方法
这里可以看到onTouch是在onTouchEvent之前执行的,而onClickListener.onClick是在onTouchEvent中的,所以onTouch的优先级会高于onCLick,接下来再看view的onTouchEvent执行了什么
此时在U型流程图中,位于最低处,从最顶层(第一层容器)已近分发到了最下面一层的View(子view)。
如果我们这里没有设置监听,子view的onTouchEvent会返回false,来看看返回到了那里
那再来看看dispatchTransformedTouchEvent方法中参数child为null时会如何执行
第二层容器是个ViewGroup继承自View,所以此时调用super.dispatchTouchEvent会进入View的dispatchTouchEvent方法,就跟之前第三层子view的dispatchTouchEvent流程一样了,如果说在第二层容器里面也没有消费事件,也就是说第二层容器的super.dispatchTouchEvent返回的是false
此时U型事件流又回到了顶层。
ps:在顶层view还没有消费该事件的情况下该事件会返回到activity的onTouchEvent中