本文结构:
1. 相关概念
1.1 事件
事件分发的对象为事件(MotionEvent):当用户触摸屏幕时(View或ViewGroup派生的控件),将产生点击事件(Touch事件)
Touch事件相关细节(发生触摸的位置、时间、历史记录、手势动作等)被封装成MotionEvent对象
典型的事件类型主要有:
- MotionEvent.ACTION_DOWN:手指刚触摸屏幕;
- MotionEvent.ACTION_MOVE:手指在屏幕上滑动;
- MotionEvent.ACTION_UP:手指从屏幕上松开的一瞬间;
- MotionEvent.ACTION_CANCEL:非人为原因结束本次事件;
事件列:从手指触摸屏幕到手指离开屏幕,这个过程产生的一系列事件。任何事件列都是以DOWN事件开始,UP事件结束,中间有无数的MOVE事件。
1.2 事件分发的本质
所谓事件分发机制,其实就是对MotionEvent事件的分发过程,即当一个MotionEvent产生以后,系统需要将这个事件传递给一个具体的View,而这个传递的过程就是分发过程。
1.3事件的传递
一个点击事件产生后,传递的顺序是Activity(Window)–> ViewGroup –> View。
2. 事件分发的流程
点击事件的分发过程由三个很重要的方法来共同完成:dispatchTouchEvent()
,onInterceptTouchEvent()
,onTouchEvent()
- 方法介绍具体如下表所示:
- Android事件分发流程如下:
总结: 当一个点击事件发生时,事件传递的过程如下:
- 事件最先传递到Activity的
dispatchTouchEvent()
进行事件分发 - 然后调用Window类实现类
PhoneWindow
的SuperDispatchTouchEvent()
- 调用DecorView的
SuperDispatchTouchEvent()
- 调用ViewGroup的
dispatchTouchEvent()
- 如果ViewGroup的
onInterceptTouchEvent()
返回true,则表示它要拦截当前事件,事件就由ViewGroup自己处理,调用自身的onTouchEvent()
;如果返回false,表示它不拦截当前事件,这时事件会传递到子元素,子元素的dispatchTouchEvent()
会被调用,如此反复