Android事件分发机制
传递流程
- Activity的
disPatchTouchEvent方法接受到事件,然后传递到PhoneWindow的disPatchTouchEvent,再从PhoneWindow传递到DecorView的disPatchTouchEvent。 - 然后事件会到达根ViewGroup的
disPatchTouchEvent,在这里会首先调用onInterceptTouchEvent判断是否需要拦截。如果拦截,则调用自己的onTouchEvent处理;不拦截则会遍历子View进行处理。 - 事件到达子View,会经
disPatchTouchEvent到达onTouchEvent,如果进行了处理,就返回true,表示事件已经消费掉,不会继续传递。 - 如果子View不处理并返回了false,事件会返回到父级ViewGroup的
disPatchTouchEvent,然后直接到达ViewGroup的onTouchEvent。 - 如果再不处理,就会继续向上冒泡,直到Activity的
onTouchEvent。
需要注意
- 只有ViewGroup有#;
- 只有View的
onTouchEvent是默认拦截的; - 重写
onTouchEvent会出现警报,表示可能会引起click事件失效,所以需要手动调用performClick方法,指定click事件的触发时机。