接着3讲
PhoneWindow中
callback 其实就是 activity (Activity attach 方法中可见)
activity首先调用 phonewindow的 superDispatchTouchEvent然后调用自己的onTouchEvent
PhoneWindow.java
decorview 继承 ViewGroup
ViewGroup 中会遍历各个子View 并传递touch事件,直至该事件被处理
至于3中如何从 ViewRoot 到 PhoneWindow 目前没有看明白 还请各位大侠不吝赐教, 任何疑问或者错误 欢迎指正 谢谢~
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 目前没有看明白 还请各位大侠不吝赐教, 任何疑问或者错误 欢迎指正 谢谢~