Android事件分发机制

本文结构:

Android事件分发机制

1. 相关概念

1.1 事件

事件分发的对象为事件(MotionEvent):当用户触摸屏幕时(View或ViewGroup派生的控件),将产生点击事件(Touch事件)

Touch事件相关细节(发生触摸的位置、时间、历史记录、手势动作等)被封装成MotionEvent对象

典型的事件类型主要有:

  1. MotionEvent.ACTION_DOWN:手指刚触摸屏幕;
  2. MotionEvent.ACTION_MOVE:手指在屏幕上滑动;
  3. MotionEvent.ACTION_UP:手指从屏幕上松开的一瞬间;
  4. MotionEvent.ACTION_CANCEL:非人为原因结束本次事件;

事件列:从手指触摸屏幕到手指离开屏幕,这个过程产生的一系列事件。任何事件列都是以DOWN事件开始,UP事件结束,中间有无数的MOVE事件。

1.2 事件分发的本质

所谓事件分发机制,其实就是对MotionEvent事件的分发过程,即当一个MotionEvent产生以后,系统需要将这个事件传递给一个具体的View,而这个传递的过程就是分发过程。

1.3事件的传递

一个点击事件产生后,传递的顺序是Activity(Window)–> ViewGroup –> View。

2. 事件分发的流程

点击事件的分发过程由三个很重要的方法来共同完成:dispatchTouchEvent()onInterceptTouchEvent()onTouchEvent()

  1. 方法介绍具体如下表所示:

Android事件分发方法

  1. Android事件分发流程如下:

事件分发业务流程图

总结: 当一个点击事件发生时,事件传递的过程如下:

  1. 事件最先传递到Activity的dispatchTouchEvent()进行事件分发
  2. 然后调用Window类实现类PhoneWindowSuperDispatchTouchEvent()
  3. 调用DecorView的SuperDispatchTouchEvent()
  4. 调用ViewGroup的dispatchTouchEvent()
  5. 如果ViewGroup的onInterceptTouchEvent()返回true,则表示它要拦截当前事件,事件就由ViewGroup自己处理,调用自身的onTouchEvent();如果返回false,表示它不拦截当前事件,这时事件会传递到子元素,子元素的dispatchTouchEvent()会被调用,如此反复