View的事件体系全面分析

基础概念

1、view中事件传递会调用的几个方法

View的事件体系全面分析_第1张图片

2、ViewGroup中事件传递会调用的几个方法

View的事件体系全面分析_第2张图片

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将不会调用。

你可能感兴趣的:(View的事件体系全面分析)