美文网首页
事件分发源码

事件分发源码

作者: pure粹 | 来源:发表于2019-03-06 10:06 被阅读0次

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的赋值

相关文章

网友评论

      本文标题:事件分发源码

      本文链接:https://www.haomeiwen.com/subject/oybzuqtx.html