1.首先分析View的dispatchTouchEvent
正常情况会进入mOnTouchListener.onTouch对应我们setOnTouchEventListener:
onTouch返回true,则消耗事件,if (!result && onTouchEvent(event))相当于短路了onTouchEvent
onTouch返回false,调用onTouchEvent,如果view是clickable,调用performClickInternal,进而调用li.mOnClickListener.onClick(this),对应setOnClickListener
2.Java层第一个方法:Activity的dispatchTouchEvent
调用getWindow.dispatchTouchEvent,window的唯一实现类PhoneWindow,即调用PhoneWindow.dispatchTouchEvent;接着调用getDecorView.dispatchTouchEvent,DecorView即FrameLayout没有实现dispatchTouchEvent,即调用父类ViewGroup.dispatchTouchEvent
3.ViewGroup.dispatchTouchEvent里面有一个bool变量intercepted两种情况
true:直接进入dispatchTransformedTouchEvent,并且child == null,
if (child ==null)
handled =super.dispatchTouchEvent(event);
即调用View的dispatchTouchEvent,回到1情况
false:(newTouchTarget ==null && childrenCount !=0)没有target且子控件不为空时,调用buildTouchDispatchChildList,
while (insertIndex >0 &&mPreSortedChildren.get(insertIndex -1).getZ() > currentZ) {
insertIndex--;
}
根据getZ值由小到大排序子控件,遍历排序后的集合,调用dispatchTransformedTouchEvent(ev, false, child, idBitsToAssign),此时child!=null,调用handled = child.dispatchTouchEvent(event),返回true后调用addTouchTarget(child, idBitsToAssign)完成mFirstTouchTarget的赋值
网友评论