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)