1,先要了解下android touch机制的三大方法:
1). public boolean dispatchTouchEvent(MotionEvent e)用于分发TouchEvent,所谓分发在我理解就是下一步这个事件的去向
2).public boolean onInterceptTouchEvent(MotionEvent e)用于拦截TouchEvent,返回true表示拦截,不在向子控件传递事件
3).public boolean onTouchEvent(MotionEvent e)用于处理事件,返回true表示消化事件,返回false则将事件逆向传给父控件.
2,Android系统中每个ViewGroup的子类都具有上面三个和TouchEvent处理相关的方法,这里需要提醒的是不是每个View的子类都需要分发,只有可以向里面添加View的的控件才需要分发,比如TextView就是最小的View了,所以就不用在再向它的子视图分发了,就不需要dispatchTouchEvent方法了。
3,至于触摸事件的传递过程,我重点参考了2个博客,大家仔细对照着流程图和log信息分析下大概就能明白了,博客地址:
http://www.cnblogs.com/jqyp/archive/2012/04/25/2469758.html
http://blog.csdn.net/hyp712/article/details/8777835,这篇博客有个地方写错了,关于 dispatchTouchEvent()方法不需要重新的问题,其实是需要的。
4,一位大牛的讲解:
1)public boolean dispatchTouchEvent(MotionEvent ev)这个方法用来分发TouchEvent
2)public boolean onInterceptTouchEvent(MotionEvent ev)这个方法用来拦截TouchEvent
3)public boolean onTouchEvent(MotionEvent ev)这个方法用来处理TouchEvent
当TouchEvent发生时,首先Activity将TouchEvent传递给最顶层的View,TouchEvent最先到达最顶层
view 的 dispatchTouchEvent ,然后由 dispatchTouchEvent 方法进行分发,
(1)、如果dispatchTouchEvent返回true,则交给这个view的onTouchEvent处理, 如果最终需要处理事件的view 的onTouchEvent()返回了false,那么该事件将被传递至其上一层次的view的onTouchEvent()处理。如果最终要处理事件的view 的onTouchEvent()返回了true,那么后续事件将可以继续传递给该view的onTouchEvent()处理。
(2)、如果dispatchTouchEvent返回 false ,则交给这个view的interceptTouchEvent方法来决定是否要拦截这个事件,如果 interceptTouchEvent 返回 true,则交给它的onTouchEvent 来处理,
(3)、如果 interceptTouchEvent 返回 false,那么就传递给子view ,由子 view 的 dispatchTouchEvent 再来开始 这个事件的分发。
(4)、如果事件传递到某一层的子 view 的onTouchEvent上了,这个方法返回了 false ,那么这个事件会从这个view 往上传递,都是 onTouchEvent来接收。
(5)、如果传递到最上面的 onTouchEvent 也返回 false的话,这个事件就会“消失”,而且接收不到下一次事件。
3)public boolean onTouchEvent(MotionEvent ev)这个方法用来处理TouchEvent
当TouchEvent发生时,首先Activity将TouchEvent传递给最顶层的View,TouchEvent最先到达最顶层
view 的 dispatchTouchEvent ,然后由 dispatchTouchEvent 方法进行分发,
(1)、如果dispatchTouchEvent返回true,则交给这个view的onTouchEvent处理, 如果最终需要处理事件的view 的onTouchEvent()返回了false,那么该事件将被传递至其上一层次的view的onTouchEvent()处理。如果最终要处理事件的view 的onTouchEvent()返回了true,那么后续事件将可以继续传递给该view的onTouchEvent()处理。
(2)、如果dispatchTouchEvent返回 false ,则交给这个view的interceptTouchEvent方法来决定是否要拦截这个事件,如果 interceptTouchEvent 返回 true,则交给它的onTouchEvent 来处理,
(3)、如果 interceptTouchEvent 返回 false,那么就传递给子view ,由子 view 的 dispatchTouchEvent 再来开始 这个事件的分发。
(4)、如果事件传递到某一层的子 view 的onTouchEvent上了,这个方法返回了 false ,那么这个事件会从这个view 往上传递,都是 onTouchEvent来接收。
(5)、如果传递到最上面的 onTouchEvent 也返回 false的话,这个事件就会“消失”,而且接收不到下一次事件。
5,解决ViewPager里面嵌套ListView焦点冲突问题Demo:
http://download.csdn.net/detail/hyy_hyy/7698717