Android事件分发机制

理解Android时间分发机制,首先要知道什么是Android事件,即分发对象;其次要明白事件都在哪些对象间进行传递(分发);最后才能理解整个分发过程。

一、Android事件

当用户点击屏幕时,会产生点击事件(Touch事件),Touch事件的具体细节被封装成MotionEvent对象。事件类型有如下4类:

Android事件分发机制_第1张图片

一般情况下,事件列由一个ACTION_DOWN事件、一个ACTION_UP事件和若干ACTION_MOVE事件组成。

二、事件分发顺序

Android事件主要在Activity、ViewGroup和View之间进行传递。

Android事件分发机制_第2张图片

三、事件分发过程

1、当一个操作产生时,事件最先传递到Activity。(具体的工作由Activity的Window来完成。Window将事件传递给decor view,即所有View的父容器。从而实现Activity到ViewGroup的分发)DispatchTouchEvent()被调用,返回true则表示整个分发结束,返回false意味着事件没人处理,所有View的onTouchEvent都返回false,则Activity的onTouchEvent被调用。

2、点击事件到达ViewGroup后,ViewGroup的DispatchTouchEvent()会被调用,如果ViewGroup的拦截函数onInterceptTouchEvent()返回true,则事件由ViewGroup处理,调用ViewGroup的TouchEvent(),且后续点击事件默认交给它处理,不再判断是否拦截;如果ViewGroup的拦截函数onInterceptTouchEvent()返回false,则遍历ViewGroup的所有子元素,从而实现ViewGroup到View的分发。

3、当事件到达View,因为View是一个单独的元素,因此无法继续向下传递,所以他只能自己处理事件。首先判断有没有设置OnTouchListener,如果OnTouchListener中onTouch()返回true,那么onTouchEvent()就不会调用。接着分析OnTouchEvent,OnTouchEvent默认会消耗点击事件,调用performClick,除非它是不可点击的,这时会调用父类即ViewGroup的DispatchTouchEvent(),逻辑与前面一样。

由此可见,事件的分发是由上到下的过程,而事件的处理是由下到上的过程。

注意:

1、某个View一旦决定拦截,则后续整个事件序列都只能由他处理,并且它的onInterceptTouchEvent()不会被再次调用。

2、某个View一旦开始处理事件,如果他不消耗ACTION_DOWN事件(onTouchEvent返回false),则同一事件列的后续事件都不会再交给他处理,并且事件将交给它的父元素处理,调用父元素的onTouchEvent。

你可能感兴趣的:(Android事件分发机制)