还记得 Android的事件分发机制码 ? 主要的三个方法 dispatchTouchEvent onInterceptTouchEvent onTouchEvent
1: dispatchTouchEvent 这个方法主要时用来分发事件的
2:onInterceptTouchEvent 这个方法主要时用来拦截事件的(只有ViewGroup才具备,View不具备)
3:onTouchEvent 这个方法主要是用来处理消耗事件的。
4: requestDisallowInterceptTouchEvent(true) 这个方法能够影响父 View是否拦截事件,true表示不拦截 false表示拦截事件。
当事件 TouchEvent发生时,首先 Activity将TouchEvent 传递给最顶层的 ViewGroup, TouchEvent 最先到达最顶层ViewGroup的dispatchTouchEvent , 然后由dispatchTouchEvent 方法进行分发,责任链的起点。
1: 如果 (ViewGroup)dispatchToucehEvent 返回 true 消费事件,事件就此终结
2: 如果 (ViewGroup)dispatchTouchEvent 返回 false 不消费事件,则回传给父 View 的 onTouchEvent事件,如果此时父View 的 onTouchEvent 返回true ,事件就此终结
3:如果(ViewGroup)dispatchTouchEvent 返回super 的话,那么事件会默认会调用自己的 onInterceptTouchEvent 方法
3.1 默认情况下 (ViewGroup) interceptTouchEvent回调super方法,super方法默认返回false,所以会交给子 (View)的 dispatchTouchEvent 方法处理
3.2 (ViewGroup)interceptTouchEvent返回true ,也就是拦截事件了,那么直接交给它自己的onTouchEvent来处理
3.3 (ViewGroup)interceptTouchEvent返回false ,那么就传递给子View ,由子View的dispatchTouchEvent 再来分发这个事件
4:如果子(View)的 dispatchTouchEvent 返回false , 那么就回传给 父(ViewGroup)的 onTouchEvent
4.1 如果子(View)的 dispatchTouchEvent返回 super 那么就直接调用自己的 onTouchEvent