android系统(5) android 输入事件处理流程 (下)

接着3讲

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 目前没有看明白 还请各位大侠不吝赐教, 任何疑问或者错误 欢迎指正 谢谢~

猜你喜欢

转载自lijie-sh.iteye.com/blog/1186455
今日推荐