事件处理概述:
在Android组件中,提供了事件处理的相关方法。例如,在View类中提供了onTouchEvent()方法,可以重写该方法来处理触摸屏事件,这种方式只要适用于重写组件的场景,但是仅仅重写该方法是不够的。为此,Android提供了使用setOnTouchListener()方法为组件设置监听器处理触摸屏事件
基于监听的事件处理:
在事件监听的处理模型中,主要有以下3类对象:
- Event Source(事件源):产生事件的来源,通常是各类组件,例如按钮,窗口和菜单等。
- Event (事件):事件中封装了UI组件上发生的特定事件的具体信息,如果监听器想获取UI组件上所发生的事件相关信息,一般通过Event对象来传递。
- Event Listener(事件监听器):监听事件源所发生的事件,并对不同的事件作出相应的响应。
基于回调的事件处理
为了实现回调机制的事件处理,Android为所有GUI组件都提供了一些事件处理的回调方法,方法如下:
PS:单击事件
例如,要为名称为"button1"的按钮添加一个单击事件监听器,并且实现在单击该按钮时弹出消息提示框显示单击了按钮。
Button button1 = new Button(this);
button1.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
Toast.makeText(MainActivity.this,"单击了按钮",Toast.LENGTH_SHORT).show();
}
});
PS:长按事件
需要长按某一个组件2s之后才会触发,例子如下,长按时弹出菜单
ImageView imageView = (ImageView) findViewById(R.id.imageView); //获取图片id.
imageView.setOnLongClickListener(new View.setOnLongClickListener(){
public void onLongClick(View v){
registerForContextMenu(v); //将长按事件注册到菜单中
openContextMenu(v); //打开菜单.
return true;
}
});
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo) { //创建菜单
super.onCreateContextMenu(menu, v, menuInfo);
menu.add("收藏"); //为菜单添加参数
menu.add("举报");
}
触摸事件
触摸事件就是当用户触摸屏幕之后产生的一种事件,当用户在屏幕上滑过时,可以通过触摸事件获取当前用户的坐标。在处理触摸事件时,可以通过为组件添加触摸事件监听器的方法来实现。Android为组件提供了setOnTouchListener()方法,用于为组件设置触摸事件监听器。语法定义如下
public interface View.OnTouchListener{
public abstract boolean onTouch(View v,MotionEvent event);
}
从上面接口的定义中可以看出,在实现View.OnTouchListener接口时需要重写onTouch()方法。事件触发后,调用onTouch()方法执行具体事件处理操作,同时会产生一个MotionEvent事件类对象,通过该对象获取用户当前的X坐标和Y坐标.
如
public boolean onTouch(View v,MotionEvent event){
int x = event.getX(); //获取X坐标
int y = event.getY(); //获取Y坐标
}
手势检测
Android为手势检测提供了一个GestureDetector类,该类代表一个手势检测器。在创建GestureDetector时,需要传入一个GestureDetector.OnGestureListener实例。GestureDetector.OnGestureListener 代表一个监听器,负责对用户的手势行为作出响应。
1.只需两个步骤
(1) 创建一个GestureDetector对象。在创建该对象时必须要实现一个GestureDetector.OnGestureListener监听器实例
(2) 为应用程序的Activity的TouchEvent事件绑定监听器,在事件处理中指定把Activity上的TouchEvent事件交给GestureDetector处理。这样GestureDetector就会检测是否触发了特定的手势动作。
说明:为一个组件设置单击事件与触摸事件,触摸事件首先被执行然后执行单机事件。
对于如何识别双指缩放手势问题:
在Android中,对多点触摸的支持使用MotionEvent处理,通过表达式"event.getAction()&&MotionEvent.ACTION_MASK"可以根据触摸状态得到不同的常量。
- ACTION_DOWN:第一个点按下时触发
- ACTION_UP:唯一的点被放开时触发
- ACTION_POINTER_DOWN:屏幕上多点被按住,松开一个点触发
- ACTION_POINTER_UP:屏幕上有一个点被按住,再按下其他点触发
要识别双指缩放手势,可以通过以下代码试下:
public boolean onTouchEvent(MotionEvent event){
switch(event.getAction()&&MotionEvent.ACTION_MASK){
case MotionEvent.ACTION_DOWN: //第一个点被按下
model = 1;
break;
case MotionEvent.ACTION_UP: //唯一的点被松开
model = 2;
break;
case MotionEvent.ACTION_POINTER_UP: //
model -= 1;
break;
case MotionEvent.ACTION_POINTER_DOWN:
oldDistance = distance(event);
model +=1;
break;
case MotionEvent.ACTION_MOVE:
if (model>=2){
double newDistance = distance(event);
if (newDistance>oldDistance + 1){
//提示放大
}else if (newDistance<oldDistance ){
//提示缩小
}
}
}
}