android源码---ViewGroup的dispatchTouchEvent()的源码分析

这里写图片描述
貌似在LinearLayout RelativeLayout的dispatchTouchEvent()方法都在ViewGroup中。对于TextView的也是在View中。
①当调用方法的时候,如果是ACTION_DOWN时,要清除原有的触摸的事件。
这里写图片描述
②对于cancelAndClearTouchTargets()方法,参数event不可能为null,因此重要的是for循环。然后调用dispatchTransformedTouchEvent()方法,并且传递的cancle为true.这个方法是处理触摸后view的平移的方法。
这里写图片描述
③对于平移的方法,因为传递过来的参数cancle是true。因此会调用下面划横线的方法。如果没有子view,那么就会调用父类的dispatchTouchEvent(),这样就形成了递归。否则就会调用子类的dispatchTouchEvent()的方法。这样进行判断在子view中是否进行拦截。
这里写图片描述
对于在View中的dispatchTouchEvent()方法,这里也是对当前的onTouch()方法进行判断,如果在onTouch()中返回了true.那么就代表了处理了该事件。
这里写图片描述
这里写图片描述

④清除所有的触摸对象,也就是调用recycle()置空。
这里写图片描述
⑤接着还是看dispatchTouchEvent()方法。intercepted默认为false.调用onIntercepTouchEvent()方法进行判断是否进行拦截。如果拦截就为true.
这里写图片描述
⑥如果cancled为false并且intercepted为false.也就是不是取消操作,也不是拦截操作,那么就开始执行下面的代码。
这里写图片描述
再这里使用了倒序遍历的方式,主要能找到最新加入的view。
这里写图片描述
⑦canViewReceivePointerEvents()方法,原意翻译是能接受到指针事件的view,但是在源码中发现,就是找到是visible的view
这里写图片描述
对于这个方法,主要是判断触摸的点是否在view的范围之内。也就是是否触摸了当前的view。
这里写图片描述
⑧接着看dispatchTouchEvent()方法中,这时候的传递给dispatchTransformedTouchEvent()方法中cancel为false. 如果返回的是true,那么就是已经被处理了。那么就设置alreadyDispatchedToNewToudchTarget为true。 表明已经分发到触摸的目标。并且这个Boolean值在下面还是会被使用。
这里写图片描述
⑨紧接着查看dispatchTransformedTouchEvent()中的方法。这里具体细节不太明白。但是大致还是将事件分发到子view中,返回是否处理的Boolean值,并且做相应的view矩阵变换。
这里写图片描述
这里写图片描述
⑩在上面获取的参数alreadyDispatchedToNewToudchTarget为true直接就返回已经处理。然后在这里竟然又调用dispatchTransformTouchEvent()返回是否进行处理的代码。最终也是返回boolean值。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/yuezheyue123/article/details/82706849
今日推荐