2013-12-28 17:57:17
1. Android提供了两种方式的事件处理:基于回调和基于监听的事件处理;
1.1 对基于监听的事件处理而言,主要做法是为Android界面组件绑定特定的事件监听器;
1.2 对基于回调的事件处理而言,主要是重写Android组件特定的回调方法,或者重写Actvity的回调方法;
一般来说,基于回调的事件可用于处理一些具有通用性的事件,但对于某些特定的事件,只能采用基于监听的事件处理;
2. 基于监听的事件处理
2.1 处理模型:EventSource,Event 和Event Listener。
2.2 事件处理机制是一种委派式事件处理方式:普通组件(事件源)将整个事件处理委托个特定的对象(事件监听器),当该事件源发生指定的事件时,就通知所委派的事件监听器来处理。
2.3 使用规则:确定事件源,创建合适的事件监听器,注册。
2.4 当外部动作在Android组件上进行操作时,系统会自动生成事件对象,同时作为参数被传递给注册到事件源上的事件监听器。
3. 基于回调的事件处理
3.1 对于基于回调的事件处理模型来说,事件源和事件监听器是统一的,当用户在GUI组件上激发某个事件时,组件自己特定的方法将会自动处理该事件。
3.2 基于回调的事件传播:所有基于回调的事件处理方法都有一个boolean类型的返回值,用于标识该处理方法是否能完全处理该事件。
3.3 如果返回ture,表示该处理方法已完全处理该事件,不会传播出去,false反之。
3.4 比较典型的是继承View来重写他的回调方法以实现我们的目的。
4. 关于触摸事件的分发及处理
4.1 onInterceptTouchEvent(MotionEvent ev),只有继承自ViewGroup的类才会有这个方法,
所以像TextView,ImageView等都是没有这个方法的,这个方法类似于小秘书的角色,负责拦截过滤事件,
也就是说当前类是否要处理收到的Touch event取决于这个方法的过滤,return true表示当前View要处理,
系统会启动onTouchEvent()方法,并且以后所有的事件都会直接来找这个View,当然,如果父View中途插手,那另当别论,
return false 表示自己不处理,系统会继续向下(子View)分发事件;
4.2 如果onTouchEvent()不处理,直接返回false,那么交给父View去处理,直到根View,如果还没人处理,那这个事件就消失了;
4.3 如果onTouchEvent()处理,那么将收到的Touch Event分解为具体的ACTION_DOWN, ACTION_MOVE,ACTION_UP等事件予以处理;
4.4 dispatchTouchEvent()负责分发TouchEvent,是三个方法中最先执行的,最好返回super.dispatchTouchEvent(ev);
每一级View的该方法都会执行,然后执行onInterceptTouchEvent(),如果有的话,最后根据onInterceptTouchEvent的返回值,来决定是否要启动onTouchEvent。
更多详细:http://www.cnblogs.com/xiaoQLu/archive/2012/04/28/2474443.html