Android事件处理和手势

事件处理概述:

在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 ){
					//提示缩小
				}
			}
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值