android View touch的传递流程


1. ViewRootImpl    :deliverPointerEvent()

2. PhoneWindow$DecorView   :dispatchTouchEvent()

3. Activity   :dispatchTouchEvent()

4. PhoneWindow   :superDispatchTouchEvent()

5. PhoneWindow$DecorView   :superDispatchTouchEvent()

6. ViewGroup   :dispatchTouchEvent()

7.ViewGroup   :dispatchTransformedTouchEvent()

8. ViewGroup   :dispatchTouchEvent()


-> a.如果该层view容器没有事件拦截   :onInterceptTouchEvent() == false 走下面拦截的逻辑@no_intercept 

-> b.如果该层view容器有事件拦截   :onInterceptTouchEvent() == true 走下面拦截的逻辑@intercept 


==================================@no_intercept ========================================

9. 延续第7 ~ 8步,遍历传递。

10. View   :dispatchTouchEvent()

11. View   :onTouchEvent()



====================================@intercept =========================================

9. 容器view   :onInterceptTouchEvent()

10. ViewGroup   :dispatchTransformedTouchEvent()

11. View   :dispatchTouchEvent()

12. View   :onTouchEvent()


三个方法在view视图被touch的情况下:

dispatchTouchEvent()调用的时机:整个view体系保持通路的情况下,每次都调用。 有一层view dispatchTouchEvent返回false,短路。则之后整个view体系不会再调用此方法。

onInterceptTouchEvent()调用时机:整个view体系保持通路的情况下,action_down时,mFirstTouchTarget != null 时。返回true拦截了mFirstTouchTarget 会置空,则之后再也不会调用此方法。

onTouchEvent()调用时机:

整个view体系保持通路的情况下,view类总会被调用。 

viewGroup容器类:a. 如果子View onTouch()返回false没处理(mFirstTouchTarget 没赋值==null),会调用本层的onTouch();

b. 本层拦截了事件(mFirstTouchTarget 没赋值==null)。会调用本层的onTouch();


注:

dispatchTouchEvent 返回false,则系统下次不会再调用此方法。没有传递成功,则系统认为此事件无需再处理了。

什么情况下 返回false:

1. 有targetView(有childView在点中区域), targetView dispatchTouchEvent() / onTouchEvent() 返回 false; 

2. 无targetView(无childView在点中区域,或根本无childView), 当前view  onTouchEvent() 返回 false; (是否clickable ,long_clickable)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值