在Android中,人们主要通过手指与系统交互。Android把所有的touch事件都被封装成MotionEvent来进行处理,其中包括了手指点击的位置,时间等信息。其事件类型主要包括:ACTION_DOWN,ACTION_UP,ACTION_MOVE, ACTION_POINTER_DOWN, ACTION_POINTER_UP,ACTION_CANCEL。
这些事件是有触发顺序的,下面举两个栗子:
只有一个手指点击在view范围内,依次触发的事件:手指按下ACTION_DOWN→手指移动ACTION_MOVE→手指抬起ACTION_UP
多个手指点击在view范围内,依次触发的事件:第一根手指按下ACTION_DOWN→随后的手指按下ACTION_POINTER_DOWN→有手指抬起ACTION_POINTER_UP→最后一根手指抬起ACTION_UP。
为了处理这些事件,Android定义了三种方法:
dispatchTouchEvent()函数:负责分发传递事件。
onInterceptTouchEvent()函数:负责拦截事件
onTouchEvent()函数和 OnTouchListener监听:负责消费和处理事件
事件传递流程
当一个事件被触发,事件的传递从Activity.dispatchTouchEvent()开始,一直从最外层的父view开始向里面的子view传递,直到被拦截。在传递过程中,view可以通过onInterceptTouchEvent()函数进行拦截,一旦父view拦截了该事件,则不再向下传递。
如果被触发的事件被传递至最内层的view,一直未被拦截消费,则会反向向外传递,这时候父view可以通过onTouchEvent函数对事件进行消费,直到activity。另外,如果被触发的ACTION_DOWN事件在某一层未被消费,那么接下来的事件是无法被传递进来的。