事件的种类
手势类型 | 事件名称 | 说明 |
---|---|---|
按下 | MotionEvent.ACTION_DOWN | 一切事件的起点、可以有多个 |
移动 | MotionEvent.ACTION_MOVE | 手指移动时持续触发 |
抬起 | MotionEvent.ACTION_UP | 手指抬起,事件结束 |
取消 | MotionEvent.ACTION_CANCEL | 事件取消,比如ViewGroup抢夺事件 |
事件的传递
在手指接触屏幕那一刻,由屏幕到 Native 层,再由 Native 传到 Activity 的 dispatchTouchEvent();
我们来看一下Activity 的代码:
|
|
为方便查看,我在代码中加了注释,因为我们关心的是 View 的事件分发,所以我们关心的应该是getWindow().superDispatchTouchEvent(ev)
,分发的过程。跟进去我们发现 superDispatchTouchEvent(ev)
在 Window 中是一个抽象方法,在 Android 中 PhoneWindow 是 Window 的唯一实现子类。看一下 PhoneWindow#superDispatchTouchEvent(MotionEvent event)
:
|
|
发现,PhoneWindow 去调用了 DecorView 的 superDispatchTouchEvent(MotionEvent event)
,再来看一下 DecorView#superDispatchTouchEvent(MotionEvent event)
:
|
|
发现 DecorView 调用了父亲的 dispatchTouchEvent(event);
,DecorView 继承自 FrameLayout,看一下FrameLayout 发现他并没有实现该方法,所以,DecorView应该调用的是 Fragment 的父亲 ViewGroup 的dispatchTouchEvent(MotionEvent event)
,所以,事件就从屏幕最终传输到 View 和 ViewGroup 来分发和处理大概流程如下:
关键方法:
ViewGroup # dispatchTouchEvent
|
|
ViewGroup # onInterceptTouchEvent
|
|
View # dispatchTouchEvent
|
|
View # onTouchEvent()
|
|