Android的事件处理

作者: GolferChen | 来源:发表于2016-11-06 15:43 被阅读344次

    事件处理的定义

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

    两套事件处理机制

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

    效果展示:


    初始位置
    触摸后位置

    相关文章

      网友评论

      • 骑士小子12:还是不太理解基于,事件回调机制
        GolferChen: @骑士小子12 至于事件处理函数是安卓提供的,具体你可以查一下。
        GolferChen: @骑士小子12 举个例子,比如我们要实现这样的功能:单击Button对象btn时logcat上显示"按钮被点击了!"。分两步走:第一步,自定义一个组件,组件名为Mybutton(实则是自己写一个类,这个类继承于Button类,但不同的是多了事件处理方法),代码如下:
        class Mybutton extends Button{
        public Mybutton(Context context){
        super(context);
        }
        public boolean onKeyDown(int keyCode, KeyEvent event){
        super.onKeyDown(keycode, event);
        Lov.v("按钮被点击了!");
        return true;
        }
        }
        第二步,在xml文件中添加Mybutton组件 注意标签得使用包名,即<com.xxx.xxx.xxx.Mybutton
        android:id="@+id\btn"
        .......>
        这样有没有好理解一点?
      • 时光收藏秘密:之前看完view的源码和事件传递机制,正好又补了一下,不错不错。
        GolferChen: @爱吃西瓜的蝈蝈 关于自定义View,有些注释是我自己认为的,也没去考证过,比如那个super.onDraw(),我认为是绘制一个空白的矩形区域(原始View就是一个空白的矩形区域),在此基础上再绘制个性化图形,希望我的想法没错😅。
        谢谢捧场!

      本文标题:Android的事件处理

      本文链接:https://www.haomeiwen.com/subject/nqqnuttx.html