touch事件分发流程
Looper获取touch信息
-->
InputEventReceiver.dispatchInputEvent()
-->
ViewRootImpl$WindowInputEventReceiver.onInputEvent()
-->
ViewRootImpl.enqueueInputEvent() 在ViewRootImpl中有一个事件QueuedInputEvent列表,这个方法中设置列表首位是哪一个QueuedInputEvent
-->
ViewRootImpl.doProcessInputEvents() 循环调用列表事件deliverInputEvent
-->
ViewRootImpl.deliverInputEvent(QueuedInputEvent q)
-->
ViewRootImpl.deliverPointerEvent(QueuedInputEvent q)
-->
View.dispatchPointerEvent(MotionEvent event) 这个View是Root View
-->
ViewGroup.
dispathTouchEvent(MotionEvent event)
********************************************************************
ViewGroup的
dispathTouchEvent流程
ViewGroup.dispatchTouchEvent(MotionEvent event)
-->
onFilterTouchEventForSecurity(...)
为true则继续执行,否则连子View都不响应Touch事件。相当于一个开关,默认为true。可通过setFilterTouchWhenObscured(false)关闭它,这样就不再执行下去,返回false。
-->
onInterceptTouchEvent()
如果为Down事件或者mTouchTarget(曾经返回touchevent为true的View)非null的话,判断mGroupFlag是否允许intercept。允许则调用该onInterceptTouchEvent方法。可通过requestDisablowInterceptTouchEvent(false)使mGroupFlag不允许intercept,但每次touchDown的时候会自动通过resetTouchState设回true,因此需要在子View的touch方法中调用该方法。该方法是ViewGroup才有View没有的。
如果返回true则不再执行子View的touch事件。执行该View的OnTouchListener.onTouch以及GroupView.onTouchEvent(),他已经成为他父View的mTouchTarget了。
-->
dispatchTransformTouchEvent(...)
如果onInterceptTouchEvent()返回false,并且是down事件或者mTouchTarget为null则进入初始化mTouchTarget的操作,也就是调用dispatchTransformTouchEvent(...)。如果参数中child为null则说明该GroupView已经截取了onTouch事件,也就不再调用子View的Touch,但如果不为null则调用子childView的dispatchTouchEvent。
如果所有子View的dispatchTouchEvent都返回false,则最后传入子dispatchTransformTouchEvent(...)子View参数为null。也就是执行自己的OnTouchListener.onTouch以及GroupView.onTouchEvent()方法。
********************************************************************
View的
dispathTouchEvent流程
-->
OnTouchListener.onTouch
如果返回true则不再执行下去。如果父View的mTouchTarget还没赋值它就成为父View的mTouchTarget,也就是响应touch的View。
-->
onTouchEvent。如果父View的mTouchTarget还没赋值它就成为父View的mTouchTarget,也就是响应touch的View。