参考链接
http://blog.csdn.net/guolin_blog/article/details/9097463/
http://blog.csdn.net/guolin_blog/article/details/9153747
http://www.cnblogs.com/sunzn/archive/2013/05/10/3064129.html

Android事件分发老容易忘呢。。。

View的事件分发伪代码:

View.dispatchTouchEvent{
  if(mOnTouchListener != null &&  View.onTouch的返回值){
     return true;
  }
  return View.onTouchEvent(event);
}

补充:
onTouchEvent中存在一个performClick方法,onClick方法在performClick会被调用 从一个View点击到抬手的动作,执行的方法顺序如下:
View.dispatchEvent->View.setOnTouchListener中的onTouch方法-View.onTouchEvent->View.onClick

从手接触屏幕到离开,事件大致如下
此处的Log 来源于鸿洋的博客

DOWN MOVE UP事件传递如下
04-06 10:24:42.158  7857  7857 E MyButton: dispatchTouchEvent ACTION_DOWN
04-06 10:24:42.158  7857  7857 E MainActivity: onTouch ACTION_DOWN
04-06 10:24:42.158  7857  7857 E MyButton: onTouchEvent ACTION_DOWN
04-06 10:24:42.866  7857  7857 E MyButton: dispatchTouchEvent ACTION_MOVE
04-06 10:24:42.866  7857  7857 E MainActivity: onTouch ACTION_MOVE
04-06 10:24:42.866  7857  7857 E MyButton: onTouchEvent ACTION_MOVE
04-06 10:24:42.882  7857  7857 E MyButton: dispatchTouchEvent ACTION_MOVE
04-06 10:24:42.882  7857  7857 E MainActivity: onTouch ACTION_MOVE
04-06 10:24:42.882  7857  7857 E MyButton: onTouchEvent ACTION_MOVE
04-06 10:24:42.922  7857  7857 E MyButton: dispatchTouchEvent ACTION_MOVE
04-06 10:24:42.922  7857  7857 E MainActivity: onTouch ACTION_MOVE
04-06 10:24:42.922  7857  7857 E MyButton: onTouchEvent ACTION_MOVE
04-06 10:24:42.959  7857  7857 E MyButton: dispatchTouchEvent ACTION_MOVE
04-06 10:24:42.959  7857  7857 E MainActivity: onTouch ACTION_MOVE
04-06 10:24:42.959  7857  7857 E MyButton: onTouchEvent ACTION_MOVE
04-06 10:24:44.277  7857  7857 E MyButton: dispatchTouchEvent ACTION_UP
04-06 10:24:44.277  7857  7857 E MainActivity: onTouch ACTION_UP
04-06 10:24:44.277  7857  7857 E MyButton: onTouchEvent ACTION_UP
04-06 10:24:44.279  7857  7857 E MainActivity: dispatchTouchEvent OnClick

ViewGroup事件分发的伪代码:

ViewGroup.dispatchTouchEvent{
    if (disallowIntercept || ! ViewGroup.onInterceptTouchEvent(ev)) {
        //遍历child,执行以下code
        if(child.dispatchTouchEvent(ev)){
            ...
            return true;
        }
    }
    if (target == null) {  
        ...  
        return super.dispatchTouchEvent(ev);//即view.dispatchTouchEvent
    }
}
//disallowIntercept默认false 

ViewGroup事件分发执行流程:还是借郭神的图片吧,比较清晰
这里写图片描述


=====
20/12/03更新 发现一篇讲的非常好的事件分发的文章
https://www.cnblogs.com/renhui/p/12127680.html

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐