看了好多关于事件传递机制的文章,基本上都是带着源码去读的,很抽象,下面我来举一个简单的例子更形象一点吧。
1.同一个事件序列只能被一个View拦截且消耗。
2.ViewGroup默认不拦截任何事件
3.View没有onInterceptTouchEvent方法
4.View的onTouchEvent默认都会消耗事件
5.事件传递总是由外向内的
6.一旦一个元素拦截了某个事件,那么这个事件序列内的所有事件直接交给它处理

如上图,外面是一个大的Linearlayout(以下简称A),里面是一个TextView(以下简称B),如果我给A和B都设置了点击事件,在我点击B外面的区域,毫无疑问A的点击事件会被触发,当我点击B的时候,B的点击事件也会触发,看上去很简单的,但是其实也是有传递事件产生的。B被点击时,首先接收到的是当前的Activity,之后传给A,虽然A也设置了点击事件,但是ViewGroup的InterceptTouchhEvent默认返回false,是不拦截事件的,所以事件被传递到了B,因为View设置了点击事件,而且view不同于ViewGroup,默认是拦截点击事件的,view没有dispatchTouchEvent,出发了点击事件后它的TouchEvent默认都是返回true的,所以B拦截并消耗了事件。如果B没有设置点击事件,当事件传递到它的时候,则不拦截事件,事件会向上级传递到A,让A来消耗事件,此时A的点击事件被触发。