使用一些浏览器或者输入法应用时会有一些手势操作,还可以自定义手势。这些神奇的操作是怎么做的呢?这一篇重点记录手势的识别和创建。这篇的内容使用到的是android.gesture包,具体的例子参考的是Sample中GestureBuilder程序。

1、手势创建

手势创建主要用到GestureOverlayViewGestureLibrary。GestureOverlayView的父类为android.widget.FrameLayout,是手势绘图区。GestureLibrary类主要对手势进行保存、删除等操作的,存放手势的仓库。下面给出创建手势的例子,如下图,可以定义如图手势打开csdn.net

1.1、创建绘图区

  1. GestureOverlayView overlay = (GestureOverlayView) findViewById(R.id.gestures_overlay);
  2. overlay.setGestureStrokeType(GestureOverlayView.GESTURE_STROKE_TYPE_MULTIPLE);
  3. overlay.setFadeOffset(2000);  //多笔画每两次的间隔时间
  4. overlay.setGestureColor(Color.CYAN);//画笔颜色
  5. overlay.setGestureStrokeWidth(6);//画笔粗细值
  6. overlay.addOnGestureListener(new GesturesProcessor());

1.2、监听绘制

  1. private class GesturesProcessor implements GestureOverlayView.OnGestureListener {
  2. public void onGestureStarted(GestureOverlayView overlay, MotionEvent event) {
  3. mDoneButton.setEnabled(false);
  4. mGesture = null;
  5. }
  6. public void onGesture(GestureOverlayView overlay, MotionEvent event) {
  7. }
  8. public void onGestureEnded(GestureOverlayView overlay, MotionEvent event) {
  9. mGesture = overlay.getGesture();
  10. if (mGesture.getLength() < LENGTH_THRESHOLD) {
  11. overlay.clear(false);
  12. }
  13. mDoneButton.setEnabled(true);
  14. }
  15. public void onGestureCancelled(GestureOverlayView overlay, MotionEvent event) {
  16. }
  17. }

1.3、保存手势

  1. public void addGesture(View v) {
  2. if (mGesture != null) {
  3. final TextView input = (TextView) findViewById(R.id.gesture_name);
  4. final CharSequence name = input.getText();
  5. if (name.length() == 0) {
  6. input.setError(getString(R.string.error_missing_name));
  7. return;
  8. }
  9. /**
  10. * 获取手势库
  11. *   private final File mStoreFile = new File(Environment.getExternalStorageDirectory(), "gestures");
  12. *   GestureLibrary sStore = GestureLibraries.fromFile(mStoreFile);
  13. *
  14. */
  15. final GestureLibrary store = GestureBuilderActivity.getStore();
  16. store.addGesture(name.toString(), mGesture);
  17. store.save();
  18. setResult(RESULT_OK);
  19. final String path = new File(Environment.getExternalStorageDirectory(),
  20. "gestures").getAbsolutePath();
  21. Toast.makeText(this, getString(R.string.save_success, path), Toast.LENGTH_LONG).show();
  22. } else {
  23. setResult(RESULT_CANCELED);
  24. }
  25. finish();
  26. }

2、手势识别

手势识别也是经过创建绘图区、监听绘制、比对结果三个过程,这里直接给出代码。
  1. public class GesturePerformedActivity extends Activity {
  2. private final File mStoreFile = new File(
  3. Environment.getExternalStorageDirectory(), "gestures");
  4. // 手势库
  5. GestureLibrary mGestureLib;
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. // TODO Auto-generated method stub
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.gesture_perform);
  11. // 手势画板
  12. GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures_overlay);
  13. gestures.setGestureStrokeType(GestureOverlayView.GESTURE_STROKE_TYPE_MULTIPLE);
  14. gestures.setFadeOffset(2000); // 多笔画每两次的间隔时间
  15. gestures.setGestureColor(Color.CYAN);// 画笔颜色
  16. gestures.setGestureStrokeWidth(6);// 画笔粗细值
  17. // 手势识别的监听器
  18. gestures.addOnGesturePerformedListener(new GestureOverlayView.OnGesturePerformedListener() {
  19. @Override
  20. public void onGesturePerformed(GestureOverlayView overlay,
  21. Gesture gesture) {
  22. // 从手势库中查询匹配的内容,匹配的结果可能包括多个相似的结果,匹配度高的结果放在最前面
  23. ArrayList<Prediction> predictions = mGestureLib
  24. .recognize(gesture);
  25. if (predictions.size() > 0) {
  26. Prediction prediction = (Prediction) predictions.get(0);
  27. // 匹配的手势
  28. if (prediction.score > 1.0) { // 越匹配score的值越大,最大为10
  29. Toast.makeText(GesturePerformedActivity.this,
  30. prediction.name, Toast.LENGTH_SHORT).show();
  31. }
  32. }
  33. }
  34. });
  35. if (mGestureLib == null) {
  36. mGestureLib = GestureLibraries.fromFile(mStoreFile);
  37. mGestureLib.load();
  38. }
  39. }
  40. }
                       

示例下载

/**
* @author 张兴业
*  iOS入门群:83702688
*  android开发进阶群:241395671
*  我的新浪微博:@张兴业TBOW
*/

最后还有点问题,就是多笔画识别问题,这里没有很好的解决,使用OnGesturePerformedListener接听结束,有的多笔画会识别失败,尤其简单的横线竖线组合,复杂的却没有问题。如果使用GestureOverlayView.OnGestureListener监听结束,每一笔画都会调用,不能处理未知笔画数的识别。如果哪位同学完美解决了多笔画问题,请多指教,谢谢。

 

最新文章

  1. 在为ListView设置adapter时出错
  2. mysql基础用法
  3. jquery slide使用总结
  4. Java Hour 56 Spring 和 Hibernate 的集成
  5. lucene 3.0.2 + 多文件夹微博数据(时间,微博)构建索引
  6. phalcon: Profiling分析 profilter / Plugin结合,dispatcher调度控制器 监听sql执行日志
  7. Gulp 学习总结
  8. POJ2104&amp;&amp;HDU2665(静态区间第K小)
  9. SGU 168.Matrix
  10. Linux进程实时监控 - htop
  11. Win8安装ASP.net 4.5(转)
  12. TCMalloc小记
  13. 决策树ID3算法的java实现
  14. 获取博客积分排名,存入数据库,读取数据进行绘图(python,selenium,matplotlib)
  15. Effective c++ Item 28 不要返回对象内部数据(internals)的句柄(handles)
  16. Java 垃圾回收机制(早期版本)
  17. CentOS7配置MySQL5.7主备
  18. C# 简单的反射机制实例
  19. 学习JS的心路历程-类型
  20. 程序设计实习MOOC / 程序设计与算法(三)第一周测验

热门文章

  1. Java-认识字符集-转载
  2. 隐藏路由器的WIFI信号,防蹭网
  3. paip.编程语言到底有没有优劣之分优秀之分
  4. FIR.im Weekly - 上周微博热转资源精选
  5. Leetcode 111 Minimum Depth of Binary Tree 二叉树
  6. 架设证书服务器 及 让IIS启用HTTPS服务(转)
  7. 在github上写博客
  8. [算法导论]二叉查找树的实现 @ Python
  9. 正则指引-量词demo
  10. android桌面快捷方式跳转到指定activity