· 向下:事件分发过程, 以 隧道方式 将事件逐层传递下去(依次触发dispatchTouchEvent、onInterceptTouchEvent),直到最内层或者因为某一条件被终止。
· 向上:事件消费过程, 以 冒泡方式 将事件逐级往 传递(只触发onTouchEvent),直到某级 中的 onTouchEvent 方法返回 true(消费了) 。
一、相关方法:
为了理解,这里的ViewGroup:代表可以添加子View;View:代表不可以添加子View,已经是最小单元。

二、事件分析:
为了方便演示,创建了几个角色:Activity、Father1(ViewGroup)、Father2(ViewGroup)、child(View)。
注意:1、这里都是触摸的child 。
2、OnTouchListener可以拦截onTouchEvent 方法。
3、OnClick方法的优先级最低,且View必须同时消耗down和up事件才能触发。
1、事件分发:public boolean dispatchTouchEvent(MotionEvent ev)
如果事件能够传递给当前View,那么此方法一定会被调用。
· true,事件将停止向下分发,并由自己的 dispatchTouchEvent 方法进行处理;
· false,事件将停止向下分发,两种情况:
1.如果自己有父 View,则会将事件向上返回;
2.如果自己没有父View(已经是最顶层了),则由自己的 dispatchTouchEvent 方法进行处理;
· super.dispatchTouchEvent(ev),事件向下传递,直到最内层。
2、事件拦截:public boolean onInterceptTouchEvent(MotionEvent ev)
如果当前View消费了某个事件,那么在这个事件序列的后续事件中,当前View的onInterceptTouchEvent方法都不会再被调用,除非子View调用requestDisallowInterceptTouchEvent(false)方法。当然,requestDisallowInterceptTouchEvent(true)也会让onInterceptTouchEvent不被调用。
· true,将事件进行拦截,并将拦截到的事件交由自己的onTouchEvent进行处理;
· false,则表示将事件放行;
· super.onInterceptTouchEvent(ev),和返回false相同。
3、事件响应:public boolean onTouchEvent(MotionEventev)
如果 View 没有对 ACTION_DOWN 进行消费,之后的其他事件不会传递给该View。
· true,接收并消费该事件。这是系统默认的情况,除非它是不可点击的(clickable和longClickable同时为false。其中longClickable默认为false。clickable 要分情况,比如Button默认true,TextView默认false)。
· false,不消费,那么事件会向上返回
· super.onTouchEvent(ev),需要注意,设置了监听会对结果产生影响。
1、设置了OnClickListener监听,则和true相同;
2、设置了OnTouchListener监听,则看onTouch;
3、没有设置监听,则和false相同。
1、public void requestDisallowInterceptTouchEvent(boolean disallowIntercept)
此方法可以在子View中干预父View的事件分发过程,但是down事件除外。
disallowIntercept=true:请求父View别拦截。
disallowIntercept=false:请求父View 拦截。
注意:
①此方法用于子View的 dispatchTouchEvent方法,因为只有此方法是事件传递到子View时一定会被调用的。
②子View中的 down事件一定要消费,因为如果不消费,那么后续事件就不会传递到子View了。
③父View的onInterceptTouchEvent方法中也需要做出修改。
④父View中的down事件不能拦截,因为如果拦截了,后续事件就不会传递到子View了。
⑤父View中的move和up事件必须拦截,因为此方法实际上是让父View重新调用onInterceptTouchEvent方法,如果不拦截,那么重新调用onInterceptTouchEvent方法,也不会起作用的。