第79页
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;
}
}
运行程序后,触摸屏幕,显示如图7.6所示的提示信息。
图7.6 显示触摸事件信息
7.4 手势的创建与识别
教学录像:光盘\TM\lx\7\手势的创建与识别.exe
前面介绍的触摸事件比较简单,下面介绍一下如何在Android中创建和识别手势。目前有很多款手机都支持手写输入,其原理就是根据用户输入的内容,在预先定义的词库中查找最佳的匹配项供用户选择。在Android中,也需要先定义类似的词库。
7.4.1 手势的创建
下面请读者运行自己的模拟器,进入到应用程序界面,如图7.7所示。
图7.7 应用程序界面
在图7.7中,单击Gestures Builder应用,如图7.8所示。
图7.8 Gestures Builder程序界面
在图7.8中,单击Add gesture增加手势,如图7.9所示。在Name栏中输入该手势所代表的字符,在Name栏下方画出对应的手势。单击Done按钮完成手势的增加。
图7.9 增加手势界面
类似的,继续增加数字1、2、3所对应的手势,如图7.10所示。
图7.10 显示当前已经存在的手势
7.4.2 手势的导出
在创建完手势后,需要将保存手势的文件导出,以便在自己开发的应用程序中使用。打开Eclipse并切换到DDMS视图。在File Explorer中找到\mnt\sdcard\gestures文件,如图7.11所示。将该文件导出,使用默认名称。
图7.11 导出保存手势的文件
7.4.3 手势的识别
例7.5 在Eclipse中创建Android项目,名称为7.5,实现识别用户输入手势的功能。(实例位置:光盘\TM\sl\7\7.5)
(1)在res文件夹中创建子文件夹,名称为raw。将前面导出的手势文件复制到该文件夹中。
(2)修改layout文件夹中的main.xml文件,添加一个GuestOverlayView控件来接收用户的手势。修改完成后,main.xml文件代码如下:
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/background"
android:orientation="vertical" >
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:id="@+id/gestures"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1.0" />
(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 gestures = library.recognize(gesture); //获得全部预测结果
int index = 0; //保存当前预测的索引号
double score = 0.0; //保存当前预测的得分