事件处理的定义

为用户动作(点击、触摸、按键等)提供响应的机制就叫事件处理机制

两套事件处理机制

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;
        }
    }

效果展示: 初始位置 触摸后位置