android View touch的传递流程

来源:互联网 发布:数据采集器的作用 编辑:程序博客网 时间:2024/04/28 11:36


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
原创粉丝点击