PhoneWindow中
public boolean dispatchTouchEvent(MotionEvent ev) { final Callback cb = getCallback(); return cb != null && mFeatureId < 0 ? cb.dispatchTouchEvent(ev) : super.dispatchTouchEvent(ev); }
callback 其实就是 activity (Activity attach 方法中可见)
public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { onUserInteraction(); } if (getWindow().superDispatchTouchEvent(ev)) { return true; } return onTouchEvent(ev); }
activity首先调用 phonewindow的 superDispatchTouchEvent然后调用自己的onTouchEvent
PhoneWindow.java
@Override public boolean superDispatchTouchEvent(MotionEvent event) { return mDecor.superDispatchTouchEvent(event); }
private final class DecorView extends FrameLayout public boolean superDispatchTouchEvent(MotionEvent event) { return super.dispatchTouchEvent(event); }
decorview 继承 ViewGroup
public boolean dispatchTouchEvent(MotionEvent ev) { ... final int count = mChildrenCount; for (int i = count - 1; i >= 0; i--) { final View child = children[i]; if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE || child.getAnimation() != null) { child.getHitRect(frame); if (frame.contains(scrolledXInt, scrolledYInt)) { ev.setLocation(xc, yc); child.mPrivateFlags &= ~CANCEL_NEXT_UP_EVENT; if (child.dispatchTouchEvent(ev)) { mMotionTarget = child; return true; } } } } ...
ViewGroup 中会遍历各个子View 并传递touch事件,直至该事件被处理
至于3中如何从 ViewRoot 到 PhoneWindow 目前没有看明白 还请各位大侠不吝赐教, 任何疑问或者错误 欢迎指正 谢谢~