深入解析Andoird事件分发机制

alunbar 发布于 2015/10/15 11:17
阅读 621
收藏 4

本文详细讲述了Android事件分发机制,包括事件源,事件,事件监听器的概念,现在整理出来分享给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的Android源码,再谈监听与回调
   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);
     }

本文到此结束,需要的朋友可以参考下。

本文转载至:http://www.mobile-open.com/2015/85187.html

加载中
返回顶部
顶部