1. 概述
由于自己在项目中遇到事件拦截冲突 - [ListView嵌套ListView],所以这篇文章重新记录下事件分发、事件拦截的知识点,一方面用于自己学习和给以后查看做个参考,也希望对遇到诸如此类问题的兄弟做一个参考。
2. 3个方法
1>:dispatchTouchEvent:事件分发,当触摸事件发生时,首先给当前activity执行,即就是当前activity的 dispatchTouchEvent 会被执行;
这个时候,这个方法有3种返回情况:
return true:事件已被处理。被当前的view、或activity处理,到此结束,不会在向下传递;
return false:事件不会被分发。会以冒泡方式传递给上层的 view、或activity的 onTouchEvent 消费;
return super.dispatchTouchEvent(ev):事件会被分发。此时当前view的onIntercepterTouchEvent会判断,是否需要拦截事件;
2>:onInterceptTouchEvent:事件拦截,用于拦截父控件传递过来的事件,用于判断传递过来的父控件事件是否需要被当前view处理;
有3种返回情况:
return true:拦截该事件。把该事件交给当前 view的 onTouchEvent执行;
return false:不拦截、放行该事件。事件会被传递到当前 view 的 子控件中,由当前 子控件中的 dispatchTouchEvent进行处理;
return super.inInterceptTouchEvent(ev):和return true 一样,拦截该事件。把该事件交给 当前 view 的 onTouchEvent执行;
3>:onTouchEvent:当前的 view 把事件拦截了,事件会传递到这个方法中;
有3种返回情况:
return true:消费了该事件,事件到此结束;
return false:没有消费事件,事件会以冒泡方式传递到 最上层的 view 或者 activity,如果最上边的 view 或者 activity没有处理,还是 返回 false,该事件将消失。接下来的所有事件都会被 最上层的view 的 onTouchEvent捕获;
return super.onTouchEvent(event):默认情况,和 return false一样;
