事件监听,回调事件

一、事件监听涉及到三个类对象

1、EventSource(事件源)事件发生的场所

2、Event(事件):事件封装界面组件上面发生的特定事件

3、EventListener(事件监听器):负责监听事件源发生的事件

二、监听器就是程序中的MyClickListenner类,监听器类必须要程序员自己实现,关键在于实现处理。通常事件监听器必须实现的监听接口有:

1、View.OnClickListener: 单击事件的监听器必须实现的接口

2、View.OnCreateContextMenuListener: 创建上下文菜单事件的事件监听器必须要实现的的接口

3、View.onFocusChangeListener: 焦点改变事件监听器必须实现的接口

4、View.OnkeyListener: 按键事件监听器必须要实现的接口

5、View.OnLongClickListener: 长按事件监听器必须实现的接口

6、View.OnTouchListener: 触摸事件监听器必须实现的接口

三、注册监听器,只需要调用事件源的 setXxxListener(XxxListener)方法就可以了。也可以在xml中用Android:onClick属性指定监听

四、基于回调事件处理

GUI提供一些事件的处理回调方法,以View为例

1、boolean onKeyDown(int keyCode ,keyEvent event): 当用户在该组件上按下一个键,触发该方法

2、boolean onKeyLongPress(int keyCode,KeyEvent evnt): 当用户在组件上长按键时触发该方法

3、boolean onKeyShortcut(int keyCode,KeyEvent evnt): 当用户在组件上快捷键事件时,触发该方法

4、boolean onKeyUp(int keyCode,KeyEvent evnt): 当用户在组件上松开按键事件时,触发该方法

5、boolean onTouchEvent(MotionEvent event): 当用户触摸触摸屏时,触发该方法

6、boolean onTrackballEvent(MotionEvent event): 当用户触发轨迹球事件时,触发该方法

5、总的来说事件发生时,首先触发的是绑定在组件上的监听器,其次才触发该组件上面的回调方法,最后才是传播到该组件所在的Activity上。

在一些情况下,基于回调事件处理机制会更好地提高程序地内聚性

6、通过回调方法实现跟随手指地小球(重写boolean onTouchEvent(MotionEvent event))

1、自定一个DrawView,继承View

public class DrawView extends View {
    public float currentX=40;
    public float currentY=50;
   Paint paint=new Paint();//创建画笔

    public DrawView(Context context) {
        super(context);
    }

    public DrawView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    //重写onDraw
    public void onDraw(Canvas canvas){
        super.onDraw(canvas);
        paint.setColor(Color.RED);
        canvas.drawCircle(currentX,currentY,20,paint);
    }

    //重写onTouchEvent(MotionEvent event) 当发生触摸屏事件的时候发生

    public boolean onTouchEvent(MotionEvent event){
        currentX=event.getX();  //获取触摸事件的x
        currentY=event.getY();  //获取触摸事件的y
        //通知当前的组件重化自己
        invalidate();
        return true;
    }
}

二、有两种用法

1.1、可直接在xml中使用

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <com.example.asus.summary.view.DrawView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

1.2、Activity

public class DrawActivity extends AppCompatActivity {

    protected void onCreate(Bundle saveInstanceSate) {
        super.onCreate(saveInstanceSate);

      setContentView(R.layout.draw_activity);

    }
}

2、Activity

public class DrawActivity extends AppCompatActivity {

    protected void onCreate(Bundle saveInstanceSate) {
        super.onCreate(saveInstanceSate);
        LinearLayout linearLayout=new LinearLayout(this);  //线性布局管理器
        DrawView drawView=new DrawView(this);      //自定义view
        drawView.setMinimumHeight(300);
        drawView.setMinimumWidth(500);
        linearLayout.addView(drawView);    //布局容器中加入自定义view
        setContentView(linearLayout);     //设置布局
    }
}

猜你喜欢

转载自blog.csdn.net/wenge1477/article/details/81277043