事件处理的定义
为用户动作(点击、触摸、按键等)提供响应的机制就叫事件处理机制
两套事件处理机制
1.基于监听的事件处理
2.基于回调的事件处理
基于监听的事件处理
模型
Event Source(事件源)+Event(事件)+Event Listener(事件监听器)
这种模型其实是一种委托式的方式:当事件源(Button等widget组件)上发生事件(点击、触摸等)时,事件源通知其绑定的事件监听器,监听器通过调用内部的事件处理器(实质是各种方法)来进行响应。
关于事件
当外部动作施加时,系统会自动生成Event对象并作为参数传入事件处理器中。
特殊地,对于“点击”这些简单的事件,无需进行封装。
但是,对于键盘事件,我们得知道按下了哪个键,对于触摸事件,我们得知道触摸点的坐标,因此需要将事件信息封装成XXXEvent对象。
这也解释了类OnClickListener中的onClick方法和类OnTouchListener中的onTouch方法参数不一样的原因。
class myClickListener implements View.OnClickListener{
public void onClick(View source){
...}
}
class myTouchListener implements View.OnTouchListener{
public boolean onTouch(View source, TouchEvent event){
...}
}
基于回调的事件处理
和基于监听的事件处理不一样的是,事件发生后是由事件源自己处理的,不存在事件监听器。基于回调的事件处理往往需要自定义View组件
class CustomView extends View{//自定义一个跟随手指的小球组件
publlic float currentX=30;//小球的初始位置
public float currentY=40;//小球的初始位置
public int size=10;//小球的大小
public CustomView(Context context, AttributeSet set){
super(context, set);//调用父类的构造器
}
public void onDraw(Canvas canvas){//重写此方法,用于绘制小球,当实例化对象时会进行回调
super.onDraw(canvas);//调用父类View的onDraw()方法,绘制空白的矩形区域
Paint pen=new Paint();//定义画笔
pen.setColor(Color.RED);//设置画笔颜色
canvas.drawCircle(currentX, currentY, size, pen);//在空白的矩形区域绘制圆圈
}
public boolean onTouchEvent(MotionEvent event){//自定义组件的基于回调的事件处理,当相应事件发生后即回调
currentX=event.getX;//获取接触点的坐标
currentY=event.getY;//获取接触点的坐标
invalidate();//重绘,实则是重新调用onDraw()方法
return true;
}
}
效果展示: