接到上面的话题来讲,我们继续讲;我们都知道,viewgroup与view之间是组合关系;打个不确定的比方,viewgroup是一家子的家长,view是家庭成员,只有一家之主在,那么才能把膝下的孩子聚集起来了;虽然不够确切,但是我还是打比方下去,一家子作为社会的成员总要交粮纳税,那么作为官府我不管是谁纳税,总之交了粮,他就认为你这家纳税了,然而这家子谁纳了粮那是个大问题,要是家庭成员都不纳粮,那么只有自己纳,这责任还是自己扛;
对一家之主就是viewgroup,如果子视图都没有消费事件了,那么它只能分发给自己消费,他会调用super.dispatchTouchEvent(event)方法自己分发给自己,viewgroup是继承view,那么它其实调用的是view对象的
dispatchTouchEvent(event),到此接下来分析一下view的disaptchtouchenvent方法;
相对于viewgroup的disaptchtouchenvent方法view的disaptchtouchenvent逻辑链条就短的多,因为最复杂的分发机制已经被viewgroup处理了;
第一步和viewgroup的disaptchtouchenvent方法一样,是检查是否过滤此事件,这里就不过多说明了,具体的请查看这篇文章https://www.jianshu.com/p/8b73f18babb3;在这步骤之前,优先检查event.isTargetAccessibilityFocus,如果是true,那么继续判断requestAccessibilityFocus申请者是不是自己,如果不是自己,那么直接返回false,不继续分发下去了,既然讲到AccessibilityFocus,我们就说说这个特性,它相当给指定view开了优先选择特权,但是在viewgroup上是不起作用的,为啥,请看代码
if (ev.isTargetAccessibilityFocus() && isAccessibilityFocusedViewOrHost()) {
ev.setTargetAccessibilityFocus(false);
}
言归正传,接下去继续看下去,第二步判断是否设置enable标记,具体看setEnabled的方法,如果是(默认是设置的)并且响应鼠标拖动,那么可以说是消费事件;第三步,该视图设置了onTouchListener,那么调用其ontouch方法,如果返回true,说明该监听响应了该事件;第四步,以上两个步骤都没响应该事件,那么调用ontouchevent进行处理至此view的disaptchtouchenvent方法分析完毕,是不是很短。