有时候把自己每天学习的知识稍加总结,可以稍微有点成就感:
事件处理机制
不管是桌面应用还是手机应用程序,面对最多的就是用户,经常需要处理的就是用户动作——也就是需要为用户的动作提供响应,这种为用户动作提供响应的机制就是事件处理。
Android提供了强大的事件处理机制,包括两套事件处理机制:
• 基于监听的事件处理
• 基于回调的事件处理
• 基于监听的事件处理
基于监听的事件处理是一种更“面向对象”的事件处理,主要涉及如下三个对象。
• EventSource(事件源):事件发生的场所,通常就是各个组件,例如窗口、按钮、菜单等
• Event(事件):事件封装了界面组件上发生的特定事情,通常是一次用户操作,如果程序需要
获得界面组件上所发生事件的相关信息,一般通过Event对象来取得• EventListener(事件监听器):负责监听事件源所发生的事件,并对各种事件作出相应的响
应。
基于回调事件处理
从代码的实现的角度来看,基于回调的事件处理模型更加简单。如果说事件监听制是一种委托
式的事件处理,那么回调机制恰好与之相反:对于基于回调机制的事件处理模型来说,事件源
与事件监听器是统一的。为了使用回调机制类处理GUI组件上所发生的事件,我们需要为该组
件提供对应的事件处理方法–而Java又是一种静态语言,我们无法为某个对象动态的添加方
法,因此只能继承GUI组件类,并重写该组件类的事件处理方法来实现。
android触碰消息传递机制
用户的每次触碰(onClick,onLongClick)都是由一个ACTION_DOWN+n个
ACTION_MOVE+1个ACTION_UP组成的,用户触碰必先有个ACTION_DOWN响应,用户触
碰结束必然会有个ACTION_UP。(当然如果在途中被拦截,就可能不会有了!)那么View是
如何分发消息和拦截消息呢?
触摸消息
public boolean onTouchEvent(MotionEvent event){
• //参数event为手机屏幕触摸事件封装类的对象,其中封装了该事件的所有信息。3. //例如触摸的位置、触摸的类型以及触摸的时间等。该对象会在用户触摸手机屏幕时被创
建。• //该方法的返回值机理与键盘响应事件的相同,同样是当已经完整地处理了该事件且不希
望其他回调方法再次处理时返回true,否则返回false。• }
使用getX()和getY()方法获取触摸位置
使用getAction()方法获取触摸动作,下面列出常用的动作常量
MotionEvent对象常见的动作常量:
• public static final int ACTION_DOWN = 0;单点触摸动作
• public static final int ACTION_UP = 1;单点触摸离开动作
• public static final int ACTION_MOVE = 2;触摸点移动动作
• public static final int ACTION_CANCEL = 3;触摸动作取消
• public static final int ACTION_OUTSIDE = 4;触摸动作超出边界
• public static final int ACTION_POINTER_DOWN = 5;多点触摸动作
• public static final int ACTION_POINTER_UP = 6;多点离开动作
事件分发:
View及其子类都会有的两个方法:
• public boolean dispatchTouchEvent(MotionEvent ev) 这个方法用来分发TouchEv
ent• public boolean onTouchEvent(MotionEvent ev) 这个方法用来处理TouchEvent
特殊的View子类ViewGroup则还有一个方法:• public boolean onInterceptTouchEvent(MotionEvent ev) 这个方法用来拦截Touc
hEvent
分发
• dispatchTouchEvent 收到触碰,则向最外层的View传递消息,再向子层的View分发
拦截1. onInterceptTouchEvent 拦截返回true表示要拦截消息,不要再向子View传递。• //这里的子View不是继承关系,而是包容关系。
• //返回false则表示不拦截消息,可以继续向下一层级的View传递消息。
• //子View将可以dispatchTouchEvent 收到触碰消息再分发消息
消息处理
• onTouchEvent 处理事件,拦截了消息,或者是最后一个收到消息的View调用此方法来处理事
件。• //若返回true,则表示正确接收并处理。
• //若返回false则表示没有被处理,将向父View传递(这里的父View不是继承关系,而
是包容关系)