抖音接口授权是什么东西 抖音直播实时数据接口( 三 )


  • protected boolean dispatchHoverEvent(MotionEvent event)
该方法用来进行事件的分发,方法的返回值取决于当前 View 的 onHoverEvent() 方法和子 View 的 dispatchHoverEvent() 方法的影响 。
  • public boolean onInterceptHoverEvent(MotionEvent event)
仅 ViewGroup 拥有的方法,用来判断是否拦截某个事件 。
  • public boolean onHoverEvent(MotionEvent event)
在 dispatchHoverEvent() 方法中进行调用,用来处理 hover 事件 。
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 中有默认实现)
以上 6 种方法为当自定义 View 时适配无障碍模式可以覆盖实现的方法,可以重写 View 的这些方法或者实现 View.AccessibilityDelegate 来解决一些特殊场景下 TalkBack 播报的问题 。
其中的 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 方法:

推荐阅读