Android事件分发 笔记

参考链接
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事件分发执行流程:还是借郭神的图片吧,比较清晰
这里写图片描述

猜你喜欢

转载自blog.csdn.net/u011109881/article/details/79836596