Android开发系列之事件拦截机制

时间:2022-04-28 00:10:54

对于Android开发者来说理解事件传递机制的重要性,我想应该是不言而喻的。在一个Activity里面,我们经常会重写onTouchEvent事件,可是重写结束之后,对于是返回true还是返回false却感到迷惑。心情好的时候返回true,心情不好的时候返回false。

要完全理解事件拦截机制,我们首先需要明白这几个方法的作用:dispatchTouchEvent(MotionEvent ev),onInterceptTouchEvent(MotionEvent ev),onTouchEvent(MotionEvent ev)。

首先我们先抛出一个问题,当我们点击LinearLayout里面的一个Button的时候,按照事件传递的机制会发生什么呢?会发现ViewGroup里面,我们可以重写上面三个方法,但是在单独的一个子View里面,我们却只能重写:dispatchTouchEvent(MotionEvent ev),onTouchEvent(MotionEvent ev)。为什么呢?所以下面我们就来分别将一个这三个方法的作用。

dispatchTouchEvent(MotionEvent ev)方法作用是分发事件,当一个事件到达当前的View时,View将调用该方法进行事件的分发,正确传递到能够处理、响应的控件上面。该方法所携带的参数MotionEvent已经封装了该次事件的响应参数信息。

onInterceptTouchEvent(MotionEvent ev)方法作用是是否拦截该事件,当一个事件到达View的时候,如果View重写的该方法返回true的话,那么表示该View能够处理响应该事件,那么该事件将不会继续往下面传递。如果重写的该方法返回false,那么该事件将继续往下面的子控件传递,最终到达能够响应的子View里面。

onTouchEvent(MotionEvent ev)方法是作用处理响应事件的地方,当该方法执行完成的时候同样会返回一个boolean值,只不过该boolean值是判断是否需要向上级View反馈信息,就比如你完成一个任务之后,是否需要向项目经理报告完成结果一样。如果返回true,那么表示不需要反馈了,我已经处理好。如果返回false,那么表示需要向上级View反馈,让它决定最终的结果状态。

当然上面的三个方法参数都是MotionEvent,表示都会携带该次事件的参数信息。