Android —View的事件分发机制

       所谓的Android事件分发,其实就是对Android的MotionEvent事件进行处理的过程。而这个过程,Android给出了3个方法来处理。

分别是:dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent三个方法来完成的。

      1.dispatchTouchEvent

          此方法是用来进行事件的分发。当一个事件传递到当前View,那么此方法就一定会被调用。其返回值表示是否消耗掉当前的事件。

      2.onInterceptTouchEvent

            此方法在dispatchTouchEvent的内部调用,用来判断是否拦截某个事件。如果当前View拦截了某个事件,那么在同一个事件序列中,此方法不会被再次调用。 返回结果表示是否拦截当前事件。

      3.onTouchEvent

            此方法也是在dispatchTouchEvent的内部调用,是用来处理点击事件的方法。返回结果表示是否消耗掉当前事件。如果不消耗则在同一个事件序列中,当前View无法再次接受到事件。


      这三个方法的关系,我们可以用一段伪代码来理解:

    public boolean dispatchTouchEvent(MotionEvent ev){
        boolean consume = false;
        if(onInterceptTouchEvent(ev)){
            consume = onTouchEvent(ev);
        } else {
            consume = child.dispatchTouchEvent(ev);
        }
        
        return consume;
    }

      通过这段伪代码,我们可以大致了解到:对于一个根ViewGroup来说,点击事件首先会传递给dispatchEvent方法。这时,需要查看ViewGroup的onInterceptTouchEvent方法的返回值, (此处是分发的关健)如果该方法返回true,则表示该ViewGroup需要拦截事件,其自身的OnTouchEvent就会被调用,事件不会再向下传递。如果返回false,则表示不拦截事件,接着就会调用子View的ondispatchTouchEvent方法。如此循环下去,直到事件被最终处理掉。---------------------------------------------------------------------------- 当事件到达onTouchEvent之后,这是就需要看当前onTouchEvent的返回值了:如果当前View的onTouchEvent返回false,则自身放弃事件处理,那么他的父容器的onTouchEvent就会被调用。以此类推。如果所有的View都不处理,那么事件最终会返还给Activiety的onTouchEvent来处理。

      

         如果对上述描述还是不是很理解的话,我们可以想象一下现实生活中的管理的例子:公司的老板给总经理下达一个任务(MotionEvent),总经理接收到任务(onInterceptTouchEvent),此时考虑是否自己来处理这个任务(onInterceptTouchEvent),此时他不想自己处理,于是将任务分配给自己的秘书(下级View)来处理。----------以上是向下分发---------------此时,秘书发现自己处理不了这个任务(onTouchEvent返回false) ,那么总经理只好自己来处理。而最后总经理发现自己也搞不定这个任务(onTouchEvent返回false)。老板没办法,只好自己来处理了。--------------------以上是向上返回处理--------------

        

         通过上面的描述,我们可以大致了解,整个事件的传递过程是一个上下级关系的传递,例子中我只描述了3级关系,而这个关系是可以更多级的,然而无论多少级,这个事件传递的流程是不变的。

          此处我们需要了解一下ViewGroup和子View的区别:ViewGroup默认是不拦截任何事件的,所以其onInterceptTouchEvent默认返回fasle,而View 没有onInterceptTouchEvent方法,所以一旦事件传递给它的时候,那么他的onTouchEvent就一定会被调用。(注意:如果手动将子View的onDispatchTouchEvent重写,则子View的OnTouchEvent并不会被调用(因为onTouchEvent是在其里面调用的,重写了该方法,就覆盖了调用onTouchEvent的代码了))

                    

            以后再继续补充。。。。。。。。。。。。。


      



          

      

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值