Android事件分发机制和一些疑问

 

Android中事件分发机制介绍,该文章主要是针对了解Android事件分发机制的人,旨在提出一些问题,并附上一些理解,就此写下供大家交流,也做一个存档。

         ViewGroup中包含三个方法:

                   public   boolean   dispatchTouchEvent(MotionEvent ev) 事件分发

                   public   boolean   onInterceptTouchEvent(MotionEvent ev)   事件拦截

                   public  boolean    onTouchEvent(MotionEventev) 事件响应

         View和Activity中包含两个方法:

                  public   boolean   dispatchTouchEvent(MotionEvent ev) 事件分发  

                  public   boolean   onTouchEvent(MotionEventev) 事件响应

 

方法解释:

public   boolean   dispatchTouchEvent(MotionEvent ev) 事件分发

             return   true:事件停止分发,并交给当前控件的onTouchEvent处理

             return   false:事件继续向子控件分发,知道最内层View停止

       public   boolean   onInterceptTouchEvent(MotionEvent ev)   事件拦截

             return   true:事件停止分发,并交给当前控件的onTouchEvent处理

             return   false:事件不进行拦截,dispatchTouchEvent可以继续分发

        public   boolean   onTouchEvent(MotionEventev) 事件响应 

             return   true:事件已经消费,并在该onTouchEvent中进行处理

             return   false:事件未消费,向父控件的onTouchEvent传递,指导Activity停止

 

设置布局如下图所示:

     

 

         当触摸屏幕中的Button时,Activity首先调用dispatchTouchEvent方法,该方法返回false是向子控件分发,返回true交个自身的onTouchEvent处理;

         Activity的子控件也做类似的处理,直到最内层的Button,该Button判断事件是否在onTouchEvent中处理,如果该方法返回true表示事件已经被消耗,不再向其父控件的onTouchEvent传递;如果返回false,则将事件传递给其父控件的onTouchEvent方法,然后进行相同的处理。如下图所示:

 

 

注意:

1、   onInterceptTouchEvent方法是被dispatchTouchEvent方法调用的,作为dispatchTouchEvent的一个判断分支(判断是否拦截事件),如果onInterceptTouchEvent返回true,则交给该控件的onTouchEvent进行处理,否则dispatchTouchEvent继续向子控件分发事件

2、   关于onTouch和onTouchEvent的冲突。

a)        如果onTouch存在,则onTouch优先于onTouchEvent执行

b)        在源码中View中的dispatchTouchEvent方法中对onTouch的执行条件进行了判断;如果条件成立则执行onTouch,否则执行onTouchEvent;但是在ViewGroup中的dispatchTouchEvent方法中并没有类似判断。此处我只能暂时认为只有在View中才会有onTouchonTouchEvent的冲突,而在ViewGroup中没有冲突(个人观点)。此处存在疑问,由于我不愿意再看源码,所以望大家多多指点

3、   onTouchEvent和onTouch同时存在的问题,这条纯属个人观点,望大家指点。

由于onTouchEvent中实现了点击、长按等事件,所以必须要存在;而onTouch则可以更多样化处理触摸操作,方便提高用户体验吧

4、   关于View中onTouch和onTouchEvent冲突的解决:

a)        由于onTouch先于onTouchEvent执行,所以在onTouch方法中的返回值必须是false,只有这样时间才能够传递到onTouchEvent方法中。

b)        如果这样的话,onTouch只能处理DOWN事件,对于后续的MOVE和UP,没有办法处理

5、关于onTouch出来捣乱的部分,大家需要多多注意,至于我也没有弄清楚。

 

 

 

参考文献:

Android 编程下 Touch 事件的分发和消费机制

http://www.cnblogs.com/sunzn/archive/2013/05/10/3064129.html

 

Android事件分发机制完全解析,带你从源码的角度彻底理解(上)

http://blog.csdn.net/pi9nc/article/details/9281829

 

                                            

Android:30分钟弄明白Touch事件分发机制

http://www.cnblogs.com/linjzong/p/4191891.html

 

Android触摸事件分发机制

http://hunankeda110.iteye.com/blog/1944311

 

android 事件分发机制

http://blog.csdn.net/lanhuzi9999/article/details/26515421

 

Android手势事件分发过程分析

http://blog.csdn.net/xu_fu/article/details/32937959

 

Android中onTouch方法的执行过程以及和onClick执行发生冲突的解决办法

http://blog.csdn.net/jiangwei0910410003/article/details/17504315

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值