事件传递简介
一句话说Android事件传递机制
- Android中view的事件传递是
从外到内
然后再从内到外
传递的,如果中间有view消费
了事件,则终止事件传递。
从外到内?
- 从外到内说的是事件传递的是从最外层的view(事件是ViewGroup)一层层向其内部childView传递的。
从内到外?
- 同样的从内到外说的是事件传递的是从最内层的view一层层向其外部parent View传递的。
view事件消费?
- view事件消费,一般是指当前view处理了当前事件,一般为当前view的onTouchEvent返回true。
具体的事件传递说明
- Android中view的事件传递分为view的直接子类和ViewGroup的直接子类两种不情况,其中两种相同的地方都会涉及到
onTouchEvent()和dispatchTouchEvent()
,而viewGroup还涉及到一个方法onIntercpetTouchEvent()
。由于view的事件传递相对简单,并且ViewGroup的事件传递还会涉及到View中的事件传递流程(ViewGroup是View的子类,继承了View的特性),所以我们先说说View中事件的传递流程。
View中事件传递流程
- 当事件从外层ViewGroup传递到View中时,首先调用的是View的
dispatchTouchEvent
方法,然后再调用View的onTouchEvent()
,如果onTouchEvent()
方法返回true,则表示当前View会消费该事件,事件传递终止。如果返回false
,则会回到当前View的parent View中并调用它的onTouchEvent()
,如果onTouchEvent()
返回true,则表示当前ViewGroup消费事件,终止事件传递,否则继续向外传递,直到传递到Activity
的onTouchEvent()
。如下图所示:
View Group中的事件传递流程
- 当事件传递到ViewGroup时,首先调用
dispatchTouchEvent()
,在ViewGroup的dispatchTouchEvent()
方法中首先会调用onIntercepteTouchEvent()
判断是否需要拦截当前事件,返回true
表示当前ViewGroup拦截当前事件,不在向下传递,并调用onTouchEvent()
方法,如果onTouchEvent()
返回true表示当前ViewGroup消费当前事件,终止事件传递,如果onTouchEvent()
返回false时,则调用当前ViewGroup的parent View的onTouchEvent()
方法,同理如果当前ViewGroup的parent View的onTouchEvent()
方法放回true,则表示该view消费当前事件,并且终止事件传递,反之如果当前ViewGroup的parent View的onTouchEvent()
方法放回false,则继续向上传递事件。如下图所示: