Android下的事件分发机制
Android事件分发其实是一系列的方法调用,从最顶级Activity的dispatchEvent 方法开始,从上往下调用,当这个方法结束后,事件分发也就结束了。
事件传递相关方法:
ViewGroup有3个相关方法:
dispatchTouchEvent(MotionEvent):用于分发touch事件;
onInterceptTouchEvent(MotionEvent):是否拦截分发事件;
onTouchEvent(MotionEvent):处理事件;
View只有2个方法:
dispatchTouchEvent(MotionEvent):用于分发touch事件;
onTouchEvent(MotionEvent):处理事件;
大概流程图:
图片来源:https://www.jianshu.com/p/238d1b753e64
机制:产生touch事件后,从最顶级父view开始,依次往下传递。做父view基本都是ViewGroup来的,就会进入到onInterceptTouchEvent拦截方法,默认情况下,事件不拦截。如果拦截事件,则事件不会往下传递,而进入到自己的onTouchEvent方法。返回true就会消费此事件,返回false不处理此事件而是往上传递,进入到上级的onTouchEvent方法,事件结束。如果不拦截事件,就会往下传递,若还是ViewGroup的话,处理机制还是一样的;若是View的话直接进入onTouchEvent方法,返回true,消费事件,事件结束;返回false,事件往上传递,进入到上级的onTouchEvent方法。
对于dispatchTouchEvent分发方法,在这个方法里注意的是无论返回true还是false,事件都不会往下分发,只有当返回super.dispatchTouchEvent(),事件才会往下分发。当然最终结果还需要看onInterceptTouchEvent是否拦截。
一个touch事件会有一个down事件跟一个up事件跟一系列move事件。以down开始,up结束。