当用户触摸屏幕上的某个 View 时,handler 会对收到的消息进行以下的处理:

这里需要重点看一下 View 的 dispatchPointerEvent() 方法:
public final boolean dispatchPointerEvent(MotionEvent event) {if (event.isTouchEvent()) {return dispatchTouchEvent(event);} else {return dispatchGenericMotionEvent(event);}}在该方法中对 event 进行判断,如果是 touchEvent 就调用 dispatchTouchEvent() 方法,否则调用 dispatchGenericMotionEvent() 方法 。判断是否为 touch 事件的逻辑如下:bool MotionEvent::isTouchEvent(int32_t source, int32_t action) {if (source & AINPUT_SOURCE_CLASS_POINTER) {// Specifically excludes HOVER_MOVE and SCROLL.switch (action & AMOTION_EVENT_ACTION_MASK) {case AMOTION_EVENT_ACTION_DOWN:case AMOTION_EVENT_ACTION_MOVE:case AMOTION_EVENT_ACTION_UP:case AMOTION_EVENT_ACTION_POINTER_DOWN:case AMOTION_EVENT_ACTION_POINTER_UP:case AMOTION_EVENT_ACTION_CANCEL:case AMOTION_EVENT_ACTION_OUTSIDE:return true;}}return false;}符合以上 case 的 event 即为 TouchEvent 。首先来看一下 dispatchPointerEvent 方法中对 TouchEvent 事件的处理,进入 DecorView 的 dispatchTouchEvent() 方法中:
@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {final Window.Callback cb = mWindow.getCallback();return cb != null && !mWindow.isDestroyed() && mFeatureId < 0? cb.dispatchTouchEvent(ev) : super.dispatchTouchEvent(ev);}在该方法中,mWindow 是与 Activity 关联的 PhoneWindow 对象,由于 DecorView 是由 PhoneWindow 创建的,并且通过 setWindow() 方法,DecoView 对象持有 PhoneWindow 对象的引用 。通过 getCallback() 方法,获得了实现了 Window.Callback 的对象,而 Activity 实现了这个接口,因此当调用cb.dispatchTouchEvent(ev) 时,实际上调用的是 Activity 中的 dispatchTouchEvent() 方法 。同样的在 dispatchGenericMotionEvent() 方法中,也有类似的代码逻辑:
@Overridepublic boolean dispatchGenericMotionEvent(MotionEvent ev) {final Window.Callback cb = mWindow.getCallback();return cb != null && !mWindow.isDestroyed() && mFeatureId < 0? cb.dispatchGenericMotionEvent(ev) : super.dispatchGenericMotionEvent(ev);}此方法中实际上也是调用了 Activity 的 dispatchGenericMotionEvent() 方法对事件进行后续的分发和处理 。此时事件就已经传递到了 Activity,由 Activity 进一步进行事件分发 。3.触摸事件传递到具体 View 的过程在研究无障碍模式下的事件传递过程之前,首先来回顾一下普通模式下的事件传递机制:
3.1 普通模式的事件分发3.1.1 普通模式下事件分发 Key Method
当一个 MotionEvent 产生之后,系统需要将该事件传递给一个具体的 view,这个传递过程就是事件的分发过程 。分发过程依赖于以下三个重要方法:
- public boolean dispatchTouchEvent(MotionEvent ev)
- public boolean onInterceptTouchEvent(MotionEvent ev)
- public boolean onTouchEvent(MotionEvent event)
3.1.2 普通模式下的事件分发
整个分发过程可以用以下的流程图来表示:

3.2 无障碍模式下的事件分发无障碍模式下的事件分发与普通模式下的事件分发有很多相似之处:
3.2.1 无障碍模式下的事件分发 Key Method:
与普通事件触摸事件的分发类似,无障碍事件触发事件分发也有类似的三个重要方法:
推荐阅读
- 抖音软件怎么赚钱 抖音最新版本安装
- 抖音号查询对方手机号 通过手机号查抖音id
- 企业抖音号运营方案 抖音账号运营流程
- 抖音上传高清视频设置 抖音上传原画质的方法
- 抖音可以用电脑直播吗 直播电影版权获取方法
- 抖音认证怎么认证 抖音个人认证窍门
- 抖音星动之夜2021在哪里看 抖音星动之夜平台直播介绍
- 抖音支付什么时候上线 抖音支付正式上线情况介绍
- emoji锁屏怎么拍 抖音emoji锁屏怎么拍
- 好想好想和你在一起什么歌 抖音好想好想和你在一起数天上的星星是什么歌
