- protected boolean dispatchHoverEvent(MotionEvent event)
- public boolean onInterceptHoverEvent(MotionEvent event)
- public boolean onHoverEvent(MotionEvent event)
3.2.2 无障碍模式下的事件分发
当用户处于无障碍模式下,用户进行点击屏幕时,会调用 dispatchPointerEvent 方法中的 dispatchGenericMotionEvent 方法:
public final boolean dispatchPointerEvent(MotionEvent event) {if (event.isTouchEvent()) {return dispatchTouchEvent(event);} else {return dispatchGenericMotionEvent(event);}}实际上调用的是 Activity 的 dispatchGenericMotionEvent() 方法,Activity 接收到事件后,会传递给 PhoneWindow 再传递给 DecorView 。DecorView 会调用 View 的 dispatchGenericMotionEvent() 方法:public boolean dispatchGenericMotionEvent(MotionEvent event) {···final int source = event.getSource();if ((source & InputDevice.SOURCE_CLASS_POINTER) != 0) {final int action = event.getAction();//判断事件类型属于Hover,调用dispatch方法开始进行分发if (action == MotionEvent.ACTION_HOVER_ENTER || action == MotionEvent.ACTION_HOVER_MOVE || action == MotionEvent.ACTION_HOVER_EXIT) {if (dispatchHoverEvent(event)) {return true;}}...return false;}在该方法中,如果判断事件为 HoverEvent,就调用 ViewGroup 的 dispatchHoverEvent() 方法开始进行事件分发 。如果某个 ViewGroup 的 onInterceptHoverEvent() 方法返回 true,表示它要拦截当前事件,并交给自己处理,反之返回 false 表示不拦截当前事件,并将当前事件继续传递给子 View,子 View 会调用自己的 dispatchHoverEvent() 方法,如此循环往复直到事件最终被处理 。
在事件处理阶段,View/ViewGroup 首先会判断是否设置了 OnHoverListener,并判断它的 onHover 方法的返回值是否为 true,如果返回值为 true,则不会调用 onHoverEvent(),反之会调用 onHoverEvent() 方法对事件进行处理 。
整个处理过程可以用下面的流程图进行表示:

在 onHoverEvent() 方法中,会调用到 sendAccessibilityHoverEvent()方法,该方法后续会调用以下方法:
- sendAccessibilityEvent
- sendAccessibilityEventUnchecked
- onInitializeAccessibilityEvent
- dispatchPopulateAccessibilityEvent
- onPopulateAccessibilityEvent
- onRequestSendAccessibilityEvent(仅在 ViewGroup 中有默认实现)
其中的 sendAccessibilityEventUnchecked 方法会向上传递到 ViewRootImpl 的 requestSendAccessibilityEvent 方法中,从堆栈信息中就可以证实这一点:

接着无障碍事件会通过 AccessibilityManager 的 sendAccessibilityEvent 方法跨进程调用 system_process 进程的 AccessibilityManagerService,将 AccessibilityEvent 事件传递到 TalkBack 的 TalkBackService 中 。
4.无障碍事件的执行流程这一节主要分析从 TalkBack 发出无障碍事件,到被辅助 app 在屏幕上绘制出绿框的过程 。
TalkBack 将无障碍事件发送给被辅助 APP 时,需要 system_process 进程作为中转,对应的接口为 IAccessibilityServiceConnection.aidl 和 IAccessibilityInteractionConnection.aidl 。经过中转后,最终会调用到被触摸 View 的 performAccessibilityAction 方法中,在没有 delegate 的情况下,会执行 performAccessibilityActionInternal 方法 。在该方法中,如果是 ACTION_ACCESSIBILITY_FOCUS 事件,会执行 requestAccessibilityFocus 方法:
推荐阅读
- 抖音软件怎么赚钱 抖音最新版本安装
- 抖音号查询对方手机号 通过手机号查抖音id
- 企业抖音号运营方案 抖音账号运营流程
- 抖音上传高清视频设置 抖音上传原画质的方法
- 抖音可以用电脑直播吗 直播电影版权获取方法
- 抖音认证怎么认证 抖音个人认证窍门
- 抖音星动之夜2021在哪里看 抖音星动之夜平台直播介绍
- 抖音支付什么时候上线 抖音支付正式上线情况介绍
- emoji锁屏怎么拍 抖音emoji锁屏怎么拍
- 好想好想和你在一起什么歌 抖音好想好想和你在一起数天上的星星是什么歌
