1.?建立手势库
???????使用SDK自带例子GestureBuilder建立手势库(位置:android-sdk-windows\samples\android-8\GestureBuilder)。
???????使用GestureBuilder之前,你需要恢复其到开发环境,然后进行编绎并部署到手机上。
???????此时,就可以使用GestureBuilder建立手势库,生成的手势库文件在SCDard上,默认文件名称为:gestures
??????
???????具体步骤:
??????????????1.?新建一个?Android?项目,项目名称为?GestureBuilder
??????????????2.?进入到?android-sdk-windows\samples\
?????????????????进入到对应的版本?SDK?目录,因为我使用的是?Android2.2。
?????????????????于是再进入到?android-8?目录下,打开?GestureBuilder?项目
??????????????3.?选中?GestureBuilder?项目的?graphics、res、src?文件夹?和?AndroidManifest.xml?文件,复制它们
??????????????4.?再进入到我们自己新建的?GestureBuilder?下,删掉自己的?graphics、res、src?文件夹?和?AndroidManifest.xml?文件
?????????????????再将复制的内容粘贴到文件夹下。昨晚这些项目,就相当于将?Android的?例子程序?GestureBuilder?导入进了?eclipse?环境中
????????????????
??????????????5.?然后再将项目部属到模拟器上。出现一个添加手势库的程序。
?????????????
??????????????6.?点击?"Add gesture",就可以添加一个手势。
?????????????????在屏幕上画出一个图形,再在屏幕上方为这个图形输入一个名字。就完成了一个手势的添加。如图:
图一:绘图
?? ? ? ? ? ? ? ? ???
?? ? ? ? ? ? ??
?? ? ? ? ? ? 图二:主界面,点击?"Add gesture" 和可进入到绘图界面
?? ? ? ? ? ? ? ? ??
?? ? ? ? ? ??
??????????????7.?点击?"Done"?按钮可以保存这个手势到手势库文件
?????????????
??????????????8.?所有添加的手势都被保存到了?SD?卡根目录下的?gestures?手势库文件中。
?????????????
???????我添加了两个手势:一个?"勾"?形图形,名称为?"close" ;?一个?"W",名称为?"wjh"。
???????在接下来的示例应用中,将用到这两个手势。当在应用中,画出?"勾"?形手势时,将关闭应用。当画出?"W"?手势时,将拨打?wjh?的电话号码。
??????
2.?新建?Android?项目:?Gesture
???将生成的手势文件导出来,并放置在?Gesture?应用中。
???为了便于查找和使用,在?Gesture?应用的?res?目录下再新建一个?raw?目录,将手势库文件放置在此目录下面。如图:
???
?? ??
3.?界面设计,提供一个场地,使用户可以在此控件上可以画手势
???使用?android.gesture.GestureOverlayView?控件
?????<android.gesture.GestureOverlayView
???????????android:id="@+id/gestures"
???????????android:layout_width="fill_parent"
???????????android:layout_height="0dip"
???????????android:layout_weight="1.0" />
?
4.?当一个手势画完毕后,会触发一个事件
???????GestureOverlayView.addOnGesturePerformedListener(OnGesturePerformedListener listener)
???将用户一个手势画完后,就会调用?OnGesturePerformedListener?的?onGesturePerformed?方法。因此我们适合关注此方法,对手势进行识别。
?????public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture);
?
5.?加载手势库
???????GestureLibrary library = GestureLibraries.fromRawResource(this, R.raw.gestures);
???????library.load();
?
6.?取出匹配集合
???????/*?查找手势库中与用户画的手势库有些相似性的手势集合
????????*?并按照相似性度高到低排序,与用户画的图形最相似的手势,放在集合第一个位置?*/
????????ArrayList<Prediction> predictions = library.recognize(gesture);
?
7.?单手势识别?Activity?代码清单:
?? ? ?
- public?class?MainActivity?extends?Activity?{??
- ???????????private?GestureLibrary?library;??
- ???????????@Override??
- ???????????public?void?onCreate(Bundle?savedInstanceState)?{??
- ???????????????super.onCreate(savedInstanceState);??
- ???????????????setContentView(R.layout.main);??
- ????????????????
- ???????????????GestureOverlayView?gestureView?=?(GestureOverlayView)?findViewById(R.id.gestures);??
- ???????????????gestureView.addOnGesturePerformedListener(new?GestureListener());??
- ???????????????/*?加载手势库?*/??
- ???????????????library?=?GestureLibraries.fromRawResource(this,?R.raw.gestures);??
- ???????????????library.load();??
- ???????????}??
- ????????????
- ???????????private?final?class?GestureListener?implements?OnGesturePerformedListener?{??
- ?????????????????????@Override??
- ?????????????????????public?void?onGesturePerformed(GestureOverlayView?overlay,?Gesture?gesture)?{??
- ????????????????????????????/*?查找手势库中与用户画的手势库有些相似性的手势集合?
- ?????????????????????????????*?并按照相似性度高到低排序,与用户画的图形最相似的手势,放在集合第一个位置?*/??
- ?????????????????????????????ArrayList<Prediction>?predictions?=?library.recognize(gesture);??
- ???????????????????????????????
- ?????????????????????????????if(predictions?!=?null?&&?!predictions.isEmpty())?{??
- ????????????????????????????????????//?第0个手势是最匹配的手势??
- ????????????????????????????????????Prediction?prediction?=?predictions.get(0);??
- ????????????????????????????????????//?prediction.score?是相似度,是一个大于0、小于10的双精度数值,1就是10%相似,3就是30%相似度。??
- ????????????????????????????????????if(prediction.score?>?1)?{??
- ???????????????????????????????????????????if("close".equals(prediction.name))?{??
- ??????????????????????????????????????????????????finish();??
- ???????????????????????????????????????????}?else?if("wjh".equals(prediction.name))?{??
- ??????????????????????????????????????????????????Uri?uri?=?Uri.parse("tel:10086");??
- ??????????????????????????????????????????????????Intent?intent?=?new?Intent(Intent.ACTION_CALL,?uri);??
- ??????????????????????????????????????????????????startActivity(intent);??
- ???????????????????????????????????????????}??
- ????????????????????????????????????}?else?{??
- ???????????????????????????????????????????Toast.makeText(getApplicationContext(),?"手势不能识别",?1).show();??
- ????????????????????????????????????}??
- ?????????????????????????????}??
- ?????????????????????}??
- ???????????}??
- ????????????
- ???????????/**?
- ????????????*?销毁??Activity?,并关闭应用?
- ????????????*/??
- ???????????@Override??
- ???????????protected?void?onDestroy()?{??
- ??????????????????android.os.Process.killProcess(android.os.Process.myPid());??
- ??????????????????super.onDestroy();??
- ???????????}??
- ???????}??
?????????????
???????AndroidManifest.xml?添加拨打电话权限
?? ? ? ?
- <?xml?version="1.0"?encoding="utf-8"?>??
- ??????????????<manifest?xmlns:android="http://schemas.android.com/apk/res/android"??
- ????????????????????package="wjh.android.gesture"line-height: 18px; margin: 0