当前位置: 代码迷 >> Android >> Android深入探究札记之二十三-手势识别
  详细解决方案

Android深入探究札记之二十三-手势识别

热度:107   发布时间:2016-05-01 17:00:59.0
Android深入探究笔记之二十三--手势识别

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?项目的?graphicsressrc?文件夹??AndroidManifest.xml?文件,复制它们

??????????????4.?再进入到我们自己新建的?GestureBuilder?下,删掉自己的?graphicsressrc?文件夹??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?代码清单:

?? ? ?

view plaincopy to clipboardprint?
  1. public?class?MainActivity?extends?Activity?{??
  2. ???????????private?GestureLibrary?library;??
  3. ???????????@Override??
  4. ???????????public?void?onCreate(Bundle?savedInstanceState)?{??
  5. ???????????????super.onCreate(savedInstanceState);??
  6. ???????????????setContentView(R.layout.main);??
  7. ????????????????
  8. ???????????????GestureOverlayView?gestureView?=?(GestureOverlayView)?findViewById(R.id.gestures);??
  9. ???????????????gestureView.addOnGesturePerformedListener(new?GestureListener());??
  10. ???????????????/*?加载手势库?*/??
  11. ???????????????library?=?GestureLibraries.fromRawResource(this,?R.raw.gestures);??
  12. ???????????????library.load();??
  13. ???????????}??
  14. ????????????
  15. ???????????private?final?class?GestureListener?implements?OnGesturePerformedListener?{??
  16. ?????????????????????@Override??
  17. ?????????????????????public?void?onGesturePerformed(GestureOverlayView?overlay,?Gesture?gesture)?{??
  18. ????????????????????????????/*?查找手势库中与用户画的手势库有些相似性的手势集合?
  19. ?????????????????????????????*?并按照相似性度高到低排序,与用户画的图形最相似的手势,放在集合第一个位置?*/??
  20. ?????????????????????????????ArrayList<Prediction>?predictions?=?library.recognize(gesture);??
  21. ???????????????????????????????
  22. ?????????????????????????????if(predictions?!=?null?&&?!predictions.isEmpty())?{??
  23. ????????????????????????????????????//?第0个手势是最匹配的手势??
  24. ????????????????????????????????????Prediction?prediction?=?predictions.get(0);??
  25. ????????????????????????????????????//?prediction.score?是相似度,是一个大于0、小于10的双精度数值,1就是10%相似,3就是30%相似度。??
  26. ????????????????????????????????????if(prediction.score?>?1)?{??
  27. ???????????????????????????????????????????if("close".equals(prediction.name))?{??
  28. ??????????????????????????????????????????????????finish();??
  29. ???????????????????????????????????????????}?else?if("wjh".equals(prediction.name))?{??
  30. ??????????????????????????????????????????????????Uri?uri?=?Uri.parse("tel:10086");??
  31. ??????????????????????????????????????????????????Intent?intent?=?new?Intent(Intent.ACTION_CALL,?uri);??
  32. ??????????????????????????????????????????????????startActivity(intent);??
  33. ???????????????????????????????????????????}??
  34. ????????????????????????????????????}?else?{??
  35. ???????????????????????????????????????????Toast.makeText(getApplicationContext(),?"手势不能识别",?1).show();??
  36. ????????????????????????????????????}??
  37. ?????????????????????????????}??
  38. ?????????????????????}??
  39. ???????????}??
  40. ????????????
  41. ???????????/**?
  42. ????????????*?销毁??Activity?,并关闭应用?
  43. ????????????*/??
  44. ???????????@Override??
  45. ???????????protected?void?onDestroy()?{??
  46. ??????????????????android.os.Process.killProcess(android.os.Process.myPid());??
  47. ??????????????????super.onDestroy();??
  48. ???????????}??
  49. ???????}??
?

?????????????

???????AndroidManifest.xml?添加拨打电话权限

?? ? ? ?

view plaincopy to clipboardprint?
  1. <?xml?version="1.0"?encoding="utf-8"?>??
  2. ??????????????<manifest?xmlns:android="http://schemas.android.com/apk/res/android"??
  3. ????????????????????package="wjh.android.gesture"line-height: 18px; margin: 0
  相关解决方案