一、事件监听涉及到三个类对象
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中使用
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); //设置布局
}
}