事件分发机制

在对控件进行测量、布局、绘制一系列工作后,想要让控件与用户进行交互,就需要涉及到Android的事件分发机制。Android系统提供了一套完善的事件分发、拦截、处理机制,让控件能够对用户输入的事件进行准确的响应和处理。

触摸事件

Android中使用MotionEvent类代表一个触摸事件,比如用户的点击、滑动事件,从MotionEvent类中,可以获取事件的类型、点击坐标等一系列信息。

事件分发机制分析

在描述事件分发机制前,要明确Android的视图是树结构。树结构具有层次,一个事件会从顶层逐步向低层进行分发。如果处于上层的ViewGroup要对事件进行处理,首先要对事件进行拦截,然后再进行处理;如果不进行处理,那么需要把事件分发到底层的View或者ViewGroup。如果底层的View处理了事件,那么这个事件的生命周期就结束了,否则,这个事件还要沿着原路向上层传递。这时,上层ViewGroup可以选择对事件进行处理,或者继续向上层传递,直到事件被处理为止。

以上分析可以用下面的流程图来表示:

事件分发机制

事件处理的关键方法

当控件想要分发一个事件时,会调用dispatchTouchEvent()方法。如果返回true,表示控件完成了这个事件的分发工作;如果返回false,表示事件分发工作未完成,事件将交由上层控件处理。

当控件想要拦截一个事件时,会调用onInterceptTouchEvent()方法。只有ViewGroup才拥有该方法,因为父控件只能是ViewGroup。当父控件要对分发到子控件的事件进行处理时,就需要调用此方法,如果返回true,表示父控件拦截了这个事件;如果返回false,父控件不对事件进行拦截,将把事件分发到子控件。

当控件想要处理一个事件时,会调用onTouchEvent()方法。在这个方法中,可以根据MotionEvent类提供的信息做相应的操作。操作完毕后,如果返回true,表示事件被处理了,该事件就结束了;如果返回false,表示事件没有被处理,事件将交由上层控件,直到被处理为止。

下面使用时序图描述一个事件处理的实例:父控件将事件分发给控件,控件接着将事件分发给子控件,然而子控件没有处理事件,把事件返还给了控件,最后控件自己处理了这个事件。

事件处理

坚持原创技术分享,您的支持将鼓励我继续创作!