基础概念
1、view中事件传递会调用的几个方法
2、ViewGroup中事件传递会调用的几个方法
3,事件指的是触摸事件MotionEvent,而且事件有很多种,常见的有ACTION_DOWN,ACTION_UP,ACTION_MOVE,ACTION_CANCEL,ACTION_OUTSIDE等。
4、事件一般从Activity开始传递,然后传递到window,然后传递给顶级View,然后向下传递(子View)。
5、事件序列指的是以ACTION_DOWN作为开始,通常以ACTION_UP结束的一系列事件,当ACTION_DOWN再次触发的时候就是另外一个事件序列。
ViewGroup对事件的分发过程
1、如果当前ViewGroup能够收到事件,那么它的dispatchTouchEvent一定会被调用。如果你重写这个方法,只要你没有执行这行代码super.dispatchTouchEvent(ev),那么事件将不会向下传递,并且当前ViewGroup的onInterceptTouchEvent和onTouchEvent都将不会被执行。
2、在ViewGroup的super.dispatchTouchEvent(ev)这个方法中,会去决定是否拦截当前的事件。
3、如果ACTION_DOWN被子View消耗过(成功处理过,onTouch或onTouchEvent返回true),那么在事件序列中的下一个事件里mFirstTouchTarget就会指向当前子元素,因此mFirstTouchTarge!=null。如果此次事件ViewGroup的requestDisallowInterceptTouchEvent设置为true,那么disallowIntercept为true(默认为flase),此时可知,当前ViewGroup的onInterceptTouchEvent不会被调用,且事件不会被拦截,子View会收到事件。
4、如果当前事件是ACTION_DOWN,无论你是否设置requestDisallowInterceptTouchEvent,disallowIntercept必定为false,因为在事件为ACTION_DOWN时,都会重置状态。那么可知,此时ViewGroup的onInterceptTouchEvent必定会调用,此时如果onInterceptTouchEvent返回true那么子view收不到事件,反之,则子view则会收到事件
5、如果当ACTION_DOWN被ViewGroup拦截后,那么可知在此次事件序列接下来的事件中mFirstTouchTarget都会为null,那么可知此时ViewGroup的onInterceptTouchEvent不会被调用,intercepted=true即会拦截事件,子View不会收到事件
6、如果当前ViewGroup处理当前事件(子View没有处理),而且onTouchEvent返回true,那么当前ViewGroup将会消耗当前事件,父元素的onTouchEvent将不会调用。
7、如果当前ViewGroup处理当前事件(子View没有处理),你设置了onTouchListener,那么OnTouch事件将会被调用,如果返回true,当前view的onTouchEvent不会被调用,且父元素的onTouchEvent也不会被调用。如果返回false,当前view的onTouchEvent会被调用。
View的事件分发过程
1、如果当前View能够收到事件,那么它的dispatchTouchEvent一定会被调用。如果你重写这个方法,只要你没有执行这行代码super.dispatchTouchEvent(ev),那么事件将不会向下传递,并且当前ViewGroup的onInterceptTouchEvent和onTouchEvent都将不会被执行。
2、如果当前View能够收到事件,你设置了onTouchListener,那么OnTouch事件将会被调用,如果返回true,当前view的onTouchEvent不会被调用,且父元素的onTouchEvent也不会被调用。如果返回false,当前view的onTouchEvent会被调用。
3、如果当前View能够收到事件,而且onTouchEvent返回true,那么当前View将会消耗当前事件,父元素的onTouchEvent将不会调用。