Android提供了两种事件处理机制:
- 基于监听的事件处理(委派式事件处理)
- 基于回调的事件处理
当某个事件源被触发时(发生事件活动),Android系统最先触发的是绑定在该事件源上的事件监听器,(如果继续传播的话)接着才会触发该事件源提供的事件回调方法。
Android基于监听的事件处理的处理模型如下:
事件源,事件监听器,注册事件监听器
事件源可以是任何界面组件,注册事件监听器就是调用事件源的setXxxListener(XxxListener)方法,关键是实现事件监听器类。View.OnClickListener是触摸屏事件监听器必须实现的接口,事件处理器中的事件处理器方法是由系统负责调用的。
Android基于回调的事件处理:
对于Android基于回调的事件处理而言,主要做法就是重写Android组件特定的回调方法,或者重写Activity的回调方法。Android为绝大部分界面组件都提供了事件响应的回调方法,只要重写他们就可以了。一般来说,基于回调的事件处理可用于处理一些具有通用性的事件,基于回调的事件处理代码回显得比较简洁,但对于某些特定的事件处理,无法使用基于回调的事件处理,只能采用基于监听的事件处理。
几乎所有基于回调的事件处理方法都有一个boolean类型的返回值,该返回值用于标识该处理方法是否能完全处理该事件,为true,表示能处理,为false表示不能处理,继续传播出去。
下面的是一个基于触摸屏的回调处理方法:
public boolean onTouchEvent(MotionEvent event):相应触屏事件
参数event:参数event为手机屏幕触摸事件封装类的对象,其中封装了改事件的所有信息,例如触摸的位置,触摸的类型以及触摸的时间等,该对象会在用户触摸手机时被创建。
返回值:该方法的返回值是当该监听器已经完整地处理了改事件且不希望其他回调方法再次处理是返回true,否则返回false。
通过event.getAction获取用户触摸的事件类型,触摸事件类型有:
MotionEvent.ACTION_DOWN //屏幕被按下
MotionEvent.ACTION_UP //屏幕按下被抬起
MotionEvent.ACTION_MOVE //在屏幕中拖动
event.getX()和event.getY()(返回值为float类型) 获取触摸位置在父布局中的相对位置坐标,因为onTouchEvent()方法是View的一个方法,所以只有点击事件发生在View组件位置范围内才会调用该方法,故获得的坐标是该View中的相对于父布局的坐标,是视图坐标(可转换为其他类型,比如int类型(int)event.getX())。
event.getRawX()和event.getRawY() 获得触摸位置在Android坐标系中的位置,也就是相对于整个屏幕的坐标。
后续深入了解参考:http://www.cnblogs.com/xiaoweiz/p/3803301.html
http://wangkuiwu.github.io/2015/01/03/TouchEvent-View/