public 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)
该方法用来进行事件的分发,方法的返回值取决于当前 View 的 onTouchEvent() 方法和子 View 的 dispatchTouchEvent() 方法的影响。
- public boolean onInterceptTouchEvent(MotionEvent ev)
仅 ViewGroup 拥有的方法,用来判断是否拦截某个事件。
- public boolean onTouchEvent(MotionEvent event)
在 dispatchTouchEvent() 方法中进行调用,用来处理点击事件。
3.1.2 普通模式下的事件分发
整个分发过程可以用以下的流程图来表示:
3.2 无障碍模式下的事件分发
无障碍模式下的事件分发与普通模式下的事件分发有很多相似之处:
3.2.1 无障碍模式下的事件分发 Key Method:
与普通事件触摸事件的分发类似,无障碍事件触发事件分发也有类似的三个重要方法:
- 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 dispa