Android事件分发机制

传递流程

  1. Activity的disPatchTouchEvent方法接受到事件,然后传递到PhoneWindow的disPatchTouchEvent,再从PhoneWindow传递到DecorView的disPatchTouchEvent
  2. 然后事件会到达根ViewGroup的disPatchTouchEvent,在这里会首先调用onInterceptTouchEvent判断是否需要拦截。如果拦截,则调用自己的onTouchEvent处理;不拦截则会遍历子View进行处理。
  3. 事件到达子View,会经disPatchTouchEvent到达onTouchEvent,如果进行了处理,就返回true,表示事件已经消费掉,不会继续传递。
  4. 如果子View不处理并返回了false,事件会返回到父级ViewGroup的disPatchTouchEvent,然后直接到达ViewGroup的onTouchEvent
  5. 如果再不处理,就会继续向上冒泡,直到Activity的onTouchEvent

需要注意

  1. 只有ViewGroup有#;
  2. 只有View的onTouchEvent是默认拦截的;
  3. 重写onTouchEvent会出现警报,表示可能会引起click事件失效,所以需要手动调用performClick方法,指定click事件的触发时机。