一。自己的总结。 从大的说,其实就是一个递归。 当是down信号的时候,树型结构从顶往底,每层检查触摸事件点到了哪个子group或子view,目标是逐步精确的,刚开始是确定哪个group内,再后面某个group内的某个gruop,直到最准确的view。 详细就是 1.看看当前层是否截断,不截断的话,找到触摸点对应的子view或者子groupview。如此递进。 截断的话,不会去找触摸ivew,而直接进入当前view的dte的空参数函数。也就是调用消费流程2.2。 2.当递进到view,本质就是一个判断是否消费的流程,返回是否消费。 3.当递进到group无法再递进时,返回默认值false。上层得到false。 4.递进之后就是递归的归了。只有2种情况,有view消费,无view消费。返回值和mFirstTouchTarget都可以知道结果。 如果无view消费。说明更精确的下层居然不处理,那么范围精度更模糊的当前层需要看看自己是否处理,执行group基类(view)的dispatchtoucheven方法,其实就是view的方法。本质就是一个判断是否消费的流程。 如果有view消费。那么之后的流程会被跳过,因为已经消费过了。 小结:当处理down完信号的时候,每个group都有自己的mFirstTouchTarget,它们不是一样的,这个mFirstTouchTarget是一个逐步逼近目标view的过程,最后一层group的mFirstTouchTarget才是,比如按钮。 当然,当截断时,只会处理到截断那层。 另外没有处理的话,每层mFirstTouchTarget都是null,直接给activity处理。 当不是down信号的时候。树型结构从顶往底,每层看自己的变量mFirstTouchTarget是否存在。(因为性能关系吧,代码没有写出截断字段,但是firsttouche为空,就表明截断为true。操蛋) 1.如果存在,说明自己的子view或者子子view处理了down。找到子view,递归本函数。一直递归到最后一层的的view或group。view就直接消费流程,group的话,传递null了。又引发了2.2 2.如果不存在,(这个函数是最操蛋的,为了性能,阅读性基本为0.) 2.1说明没人处理,那么我处理看看,应该不会有这种情况,因为会有activity处理啊,如果真发生,那么也是无处理,因为第一层dector会处理,而且是默认的监听者都是null。所以应该是无处理。 2.2最常见是说明一个group在处理,最后一层的时候最后传递了null参数过来。那就执行group基类的的消费流程 2.3或者截断事件,因为没有去找触碰的子ivew。当然mFirstTouchTarget也是为null,不然,也不会进入这层,上层就返回了。截断就直接进入基类的消费流程。 ps.消费的流程:就是view 的dispath,其实就是 listenter+ oneventtouch.(on click) 当前层是否截断,就是函数 onInterceptTouchEvent 因为源代码没有可读性,代码是压缩版的,所以忘记了流程的话,先看这里的流程,再去找代码求证。
二。未完成的代码简化图。 因为代码是性能版。所以是一个fucking code!!!!!不是让人理解的版本。很弟弟的代码。
三.简化代码大概流程。 <<android 开发艺术探索>>书和网上的流程,是一样的。刚看就觉得奇怪。自己看完代码,发现是错误的,这个也太大意了吧。 public boolean dispatchTouchEvent(MotionEvent ev) { boolean consume = false; if (onInterceptTouchEvent(ev)) { consume = onTouchEvent (ev) ; } else { consume = child.dispatchTouchEvent (ev) ; } return consume; } 自己修改后认为正确的 public boolean dispatchTouchEvent(MotionEvent ev) { boolean consume = false; int action=ev.getAction()& MotionEvent.ACTION_MASK; intercepted=onInterceptTouchEvent(ev) if (intercepted ) { consume = onTouchEvent (ev) ; } else { if(action==down) { consume = child.dispatchTouchEvent (ev) ; if(consume==false)//这里不能少,递归回来需要判断是否消费了,没有消费,自己要消费掉。源码是 判断mFirstTouchTarget这个值是否为null. { consume = onTouchEvent (ev) ; } } else { if(child==null)//是不是到底了,如果当前view就是最下层消费的view。那就直接消费掉。否则继续递归下去。 { consume = onTouchEvent (ev) ; } else { child.dispatchTouchEvent (ev) ; } } } return consume; }