当前位置: 代码迷 >> Android >> android系统(五) android 输入事件处理流程 (下)
  详细解决方案

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

热度:96   发布时间:2016-05-01 20:00:46.0
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
@Overridepublic 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 目前没有看明白 还请各位大侠不吝赐教, 任何疑问或者错误 欢迎指正 谢谢~

  相关解决方案