当用户触摸屏幕时,系统会对触摸事件做出相应的相应,这个事件会产生一个MotionEvent,系统根据一定的规则将其传递给View进行处理,这个过程就是事件分发机制了。
事件的传递分为两个阶段,即捕获阶段和冒泡阶段。捕获阶段:事件先由外层的View接收,然后依次向内层传递,直到传递到小的View,捕获阶段完成;冒泡阶段:也就是捕获阶段的逆过程,先由小的View开始向外冒泡,直到将事件传递到外层View。
在捕获和冒泡的过程中,可以控制事件是否被拦截,是否继续分发,还是做出响应后消费掉,这里是通过三个方法来控制事件的传递和消费机制的,系统又根据方法的返回值来进行相应的控制:
事件分发方法:publicbooleandispatchTouchEvent(MotionEventev)
当系统监听到事件时,首先由Activity捕获到,如果该方法中返回true,表示事件将不进行分发了,并且事件自身被消费掉了,此时事件分发过程结束;如果该方法返回为false,表示事件还是不会向下分发,而是由上层的onTouchEvent方法进行消费;如果该方法返回为 super.dispatchTouchEvent(ev),事件将分发给本层的事件拦截onInterceptTouchEvent 方法进行处理。
事件拦截方法:publicbooleanonInterceptTouchEvent(MotionEventev)
如果该方法返回 true,表示将事件进行拦截,并将拦截到的事件交由本层控件的onTouchEvent进行处理;如果该方法返回是false或super.onInterceptTouchEvent(ev),则表示不对事件进行拦截,并将事件分发到子View,由子View的dispatchTouchEvent进行处理。
事件响应方法:public booleanonTouchEvent(MotionEventev)
如果该方法返回true,表示onTouchEvent处理完事件后消费了此次事件,此时事件终结,将不会进行后续的冒泡;如果onTouchEvent返回false或super.onTouchEvent(ev),事件在onTouchEvent中处理后继续向上层View冒泡,且由上层View的onTouchEvent进行处理。