Android Touch事件传递机制

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的话,这个事件就会“消失”,而且接收不到下一次事件。



5,解决ViewPager里面嵌套ListView焦点冲突问题Demo:

              http://download.csdn.net/detail/hyy_hyy/7698717
                     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值