Touch事件分配流程备忘

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值