随我一起慢慢揭开Andoird里事件分发机制的神秘面纱

来源:转载

学了这么久的Android,面试也常被问到事件分发机制,但总感觉对这个机制还是不清不楚.突然之间 翻了一下李刚的<Crazy Android>,突然有了一些感悟,所以就立马记下来:

 

一、监听与回调   第一,要明白和事件相关的3个概念:事件源,事件,事件监听器.
   事件源:就是事件作用的对象
   事件:就是事件本身,可以是点击,长按,移动等等,就是XxxEvent.
   事件监听器:就是Listener,一般写成内部类的形式,说白了,就是一个类,而这个类往往是事件源
           内部的接口实现类。 
 
   第二,<Crazy Android>上总结得很到位:Android中的事件处理机制可以分为两大类,监听和回调.
   监听:就是给控件添加一个监听器,即addXxxListener(new XxxListener(){...}),事件源本身不直
      接处理,而是交由事件监听器进行处理.
   回调:当事件作用在事件源的时候,事件源本身会触发一些自己的方法,自己来处理事件.但往往事件
     源的这些方法是封装在事件源对象的内部的,用户看不见.这也就是为什么需要有监听器的原
     因,让用户知道事件源发生了什么事件.通常在自定义控件的时候,就需要复写和Touch相关的
     事件,同时抽取监听器接口,让用户去实现.
 
-----------------------------------------------------------------------------------------
   举个小例子:
      假如有这样一个需求:点击一下Button,打印一条日志.
      那么有2种实现方式
      第1种实现方式-为Button设置监听器
         Button.setOnClickListener(new OnClickListener(){
         onClick(View view)
           {
              Log...
            } 
         }); 
      第2种实现方式-继承Button,自定义一个MyButton
         定义的时候,复写Button的onTouchEvent方法,在里面打印日志.
      
     那么,现在又有一个需求:点击一下Button,弹出一个吐司.
      如果采用第1种方式,只要修改一下onClick里的代码.
      如果采用第2种方式,那么1种办法是再创建一个Button的子类,另外一个方法就是修改原来
        MyButton的onTouchEvent方法,但是这样一来又不能满足开始的需求了.
      
      所以到这里,监听与回调的区别也就不言而喻了吧.
 
二、结合2.3.3中View的源码,再谈监听与回调 
   1.View的dispatchTouchEvent方法
    我之前一直没有搞清楚View的dispatchTouchEvent的返回值的作用,现在明白了,
    返回true,作用在View上的触摸事件(包括Button的点击事件)就会生效;
    返回false,作用在View上的触摸事件就失效。
    但具体dispatchTouchEvent方法又在哪里被调用了呢(?????????????) 
 

 public boolean dispatchTouchEvent(MotionEvent event) { 。。。 if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED && mOnTouchListener.onTouch(this, event)) { return true; } return onTouchEvent(event); } 

 





分享给朋友:
您可能感兴趣的文章:
随机阅读: