Android中view的事件分发机制
1、View的事件分发涉及到 3个核心的方法,第一个是dispatchtouchevent,这个方法是用来进行事件分发,如果事件能够 传 递 给 当 前 view, 那 么 此 方 法 一 定 被 调 用 , 它 的 返 回 值 受 当 前 view 的 ontouchevent和下级 view的 dispatchevent的影响,表示是否消 耗当前事件;第二个方法是 oninterceptouchevent,这个方法在 dispatchtouchevent方法内部调用,用来判断是否拦截某个事件,如 果 当 前 view 拦 截 了 某 个 事 件 , 那 么 在 同 一 事 件 序 列 中 , 此 方 法 不 会 再;次被调用,返回的结果表示是否拦截当前事件;第三个方法是 ontouchevent,这个方法也是在 dispatchtouchevent方法中调用, 用来处理点击事件,返回的结果表示是否消耗当前时间,如果不消耗,同 一 事 件 序 列 中 , 当 前 view 无 法 再 次 接 受 到 事 件 。
2、 具体来说,对于一个根 viewgroup来说,点击事件产生后,首先会传递给它,这时它的dispatchtouchevent方法会被调用,如果这 个 viewgroup的 interceptedtouchevent方法返回为 true,就表示它 要拦截当前事件,接着事件就会交给这个 viewgroup处理,即它的 ontouchevent 方 法 会 被 调 用 ; 如 果 这 个 viewgroup 的 oninterceptouchevent方法返回为 false,就表示它不拦截当前事件, 这时当前事件就会继续传递给它的子元素,接着子元素的 dispatchtouchevent方法就会被调用,如此往复,直至事件最终被处 理,当一个 view开始处理某个事件,如果它设置了 ontouchlistener, 那么它的 ontouch方法会被调用,如果当前 view的 ontouch返回为true,那么 ontouchevent方法不会被调用,如果返回为 false,当前 view的 ontouchevent方法会被调用,如果当前 view还设置了 onclicklistener,那么 onclick也会被随后调用。