Android事件处理

用户在使用手机、平板电脑时,总是通过各种操作来与软件进行交互,较常见的方式包括键盘操作、触摸操作和手势等。

事件处理概述

事件就是用户对图形界面的操作。在Android手机和平板电脑上,主要包括键盘事件和触摸事 件两大类。键盘事件包括按下、弹起等,触摸事件包括按下、弹起、滑动、双击等。

在Android控件中,提供了事件处理的相关方法。例如在View类中,提供了onTouchEvent()方法来处理触摸事件。但是,仅有重写这个方法才能完成事件处理 显然并不实用。这种方式主要适用于重写控件的场景。除了onTouchEvent()方法,还可以使用setOnTouchListener()方法为控件设置监听器来处理触摸事件,这在日常开发中更

处理键盘事件

物理按键简介

对于一个标准的Android设备,包含了多个能够触发事件的物理按键,各个可用的物理按键能够触发的事件及其说明

物理按键 KeyEvent 说明
电源键 KEYCODE_POWER 启动或唤醒设备,将界面切换到锁定的屏幕
后退键 KEYCODE_BACK 返回到前一个界面
菜单键 KEYCODE_MENU 显示当前应用的可用菜单
Home键 KEYCODE_HOME 返回到Home界面
查找键 KEYCODE_SEARCH 在当前应用中启动搜索
相机键 KEYCODE_CAMERA 启动相机
音量键 KEYCODE_VOLUME_UP KEYCODE_VOLUME_DOWN 控制当前上下文音量,如音乐播放器、手机铃声、通话音量等
方向键 KEYCODE_DPAD_CENTER KEYCODE_DPAD_UP KEYCODE_DPAD_DOWN KEYCODE_DPAD_LEFT KEYCODE_DPAD_RIGHT 某些设备中包含方向键,用于移动光标等
键盘键 KEYCODE_0, …, KEYCODE_9, KEYCODE_A, …, KEYCODE_Z 数字09、字母AZ等按键

Android中控件在处理物理按键事件时,提供的回调方法有onKeyUp()、onKeyDown()和onKeyLongPress()

屏蔽后退键

屏蔽物理键盘中的后退键。

编写ForbiddenBackActivity,重写onCreate()方法来加载布局文件,重写onKeyDown()方法来拦截用户单击后退按钮事件,代码如下:

public class ForbiddenBackActivity extends Activity { 
	@Override 
	protected void onCreate(Bundle savedInstanceState) { 
		super.onCreate(savedInstanceState); 
		setContentView(R.layout.main); //设置页面布局 
	}
	
	@Override 
	public boolean onKeyDown(int keyCode, KeyEvent event) { 
		if (keyCode == KeyEvent.KEYCODE_BACK) { 
			return true; //屏蔽后退键 
		}
		return super.onKeyDown(keyCode, event); 
	} 
}

提示音量增加事件

当用户单击增加音量键时显示提示信息

编写VolumeUpMessageActivity类,它继承了Activity类。重写onCreate()方法来加载布局文件,重写onKeyDown()方法,当音量增加键被按下时显示提示信息,代

public class VolumeUpMessageActivity extends Activity { 
	@Override 
	protected void onCreate(Bundle savedInstanceState) { 
		super.onCreate(savedInstanceState); 
		setContentView(R.layout.main); //设置页面布局 
	}
	
	@Override 
	public boolean onKeyDown(int keyCode, KeyEvent event) { 
		if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) { 
			Toast.makeText(this, "音量增加", Toast.LENGTH_LONG).show(); //提示音量增加 
			return false; 
		}
		return super.onKeyDown(keyCode, event); 
	} 
}

注意: 当单击音量增加键时,onKeyDown()方法的返回值是false,这并没有屏蔽该键的功能。

处理触摸事件

目前,主流的手机都以较大的屏幕取代了外置键盘,平板电脑也没有提供键盘,这些设备都需要通过触摸来操作,下面介绍一下Android中如何实现触摸事 件的处理。

按钮触摸事件

对于触摸屏上的按钮,可以使用OnClickListener和OnLongClickListener监听器分别处理用户短时间单击和长时间单击(按住按钮一段时间)事件。

编写TouchEventActivity类,它继承了Activity类。重写onCreate()方法来加载布局文件,使用findViewById()方法获得布局文件中定义的按钮,并为其增加 OnClickListener和OnLongClickListener事件监听器,代码如下:

public class TouchEventActivity extends Activity { 
	/** Called when the activity is first created. */ 
	@Override 
	public void onCreate(Bundle savedInstanceState) { 
		super.onCreate(savedInstanceState); 
		setContentView(R.layout.main); //设置页面布局 
		Button button = (Button) findViewById(R.id.button); //获得按钮控件 
		button.setOnClickListener(new OnClickListener() { 
			public void onClick(View v) { 
				//处理用户短时间单击按钮事件 
				Toast.makeText(TouchEventActivity.this, getText(R.string.short_click), 
				Toast.LENGTH_SHORT).show(); 
			} 
		}); 
		
		button.setOnLongClickListener(new OnLongClickListener() { 
			public boolean onLongClick(View v) { //处理用户长时间单击按钮事件 
				Toast.makeText(TouchEventActivity.this, getText(R.string.long_click), 
				Toast.LENGTH_SHORT).show(); return true; 
			} 
		}); 
	} 
}

View类是其他Android控件的父类。在该类中,定义了setOnTouchListener()方法用来为控件设置触摸事件监听器,下面演示该监听器的用法。

检测触摸事件

当用户触摸屏幕时显示提示信息

编写ScreenTouchEventActivity类,它继承了Activity类并实现了OnTouchListener接口。重写onCreate()方法来定义线性布局管理器,并为其增加触摸事件监听器 及设置背景图片,重写onTouch()方法来处理触摸事件,显示提示信息,代码如下:

public class ScreenTouchEventActivity extends Activity implements OnTouchListener { 
	@Override 
	protected void onCreate(Bundle savedInstanceState) { 
		super.onCreate(savedInstanceState); //调用父类构造方法 
		LinearLayout layout = new LinearLayout(this); //定义线性布局 
		layout.setOnTouchListener(this); //设置触摸事件监听器 
		layout.setBackgroundResource(R.drawable.background); //设置背景图片 
		setContentView(layout); //使用布局 
	}
	
	@Override 
	public boolean onTouch(View v, MotionEvent event) { 
		Toast.makeText(this, "发生触摸事件", Toast.LENGTH_LONG).show(); return true; 
	} 
}

手势的创建与识别

前面介绍的触摸事件比较简单,下面介绍一下如何在Android中创建和识别手势。目前有很多款手机都支持手写输入,其原理就是根据用户输入的内容,在 预先定义的词库中查找最佳的匹配项供用户选择。在Android中,也需要先定义类似的词库。

单击Gestures Builder应用

单击Add gesture增加手势,在Name栏中输入该手势所代表的字符,在Name栏下方画出对应的手势。单击Done按钮完成手势的增加

类似的,继续增加数字1、2、3所对应的手势

手势的导出

在创建完手势后,需要将保存手势的文件导出,以便在自己开发的应用程序中使用。打开Eclipse并切换到DDMS视图。在File Explorer中找到 \mnt\sdcard\gestures文件,如图7.11所示。将该文件导出,使用默认名称。

手势的识别

实现识别用户输入手势的功能。
(1)在res文件夹中创建子文件夹,名称为raw。将前面导出的手势文件复制到该文件夹中。
(2)修改layout文件夹中的main.xml文件,添加一个GuestOverlayView控件来接收用户的手势。修改完成后,main.xml文件代码如下

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
	android:layout_width="fill_parent" 
	android:layout_height="fill_parent" 
	android:background="@drawable/background" 
	android:orientation="vertical" > 
	
	<TextView android:layout_width="fill_parent" 
		android:layout_height="wrap_content" 
		android:gravity="center_horizontal" 
		android:text="@string/title" 
		android:textColor="@android:color/black" android:textSize="20dp" /> 
	
	<android.gesture.GestureOverlayView android:id="@+id/gestures" 
		android:layout_width="fill_parent" 
		android:layout_height="0dip" 
		android:layout_weight="1.0" /> 
</LinearLayout>

(3)创建GesturesRecognitionActivity类,它继承了Activity类并实现了OnGesturePerformedListener接口。在onCreate()方法中,加载raw文件夹中的手势文件,接着获 得布局文件中定义的GestureOverlayView控件。在onGesturePerformed()方法的实现中,获得得分最高的预测结果并提示,该类代码如下:

public class GesturesRecognitionActivity extends Activity implements OnGesturePerformedListener { 
	private GestureLibrary library; 
	
	@Override 
	public void onCreate(Bundle savedInstanceState) { 
		super.onCreate(savedInstanceState); 
		setContentView(R.layout.main); 
		library = GestureLibraries.fromRawResource(this, R.raw.gestures); //加载手势文件 
		
		if (!library.load()) { //如果加载失败则退出 
			finish(); 
		}
		
		GestureOverlayView gesture = (GestureOverlayView) findViewById(R.id.gestures); 
		gesture.addOnGesturePerformedListener(this); //增加事件监听器 
	}
	
	@Override 
	public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) { 
		ArrayList<Prediction> gestures = library.recognize(gesture); //获得全部预测结果 
		int index = 0; //保存当前预测的索引号 double score = 0.0; //保存当前预测的得分 
		for (int i = 0; i < gestures.size(); i++) { //获得最佳匹配结果 
			Prediction result = gestures.get(i); //获得一个预测结果 
			if (result.score > score) { 
				index = i; 
				score = result.score; 
			} 
		}
		Toast.makeText(this, gestures.get(index).name, Toast.LENGTH_LONG).show(); 
	} 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值