使用一些浏览器或者输入法应用时会有一些手势操作,还可以自定义手势。这些神奇的操作是怎么做的呢?这一篇重点记录手势的识别和创建。这篇的内容使用到的是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监听结束,每一笔画都会调用,不能处理未知笔画数的识别。如果哪位同学完美解决了多笔画问题,请多指教,谢谢。

 

android手势创建及识别的更多相关文章

  1. Android 手势水平监听判断

    package com.zihao.ui; import com.zihao.R; import android.os.Bundle; import android.app.Activity; imp ...

  2. Android 数据库管理— — —创建数据库

    <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...

  3. Android二维码识别 开源项目ZXing的编译

    Android二维码识别 开源项目ZXing的编译 Android端的条形码/二维码识别功能 因为手机端的输入不是很方便,所以条形码/二维码的扫描是一种很有效的解决手段. 比较流行的手机应用中,常用的 ...

  4. [转]Android Studio创建Xposed模块项目时BridgeApi的正确添加方式

    使用Android Studio创建的空项目作为Xposed Module App,对于Api Jar包的引用方式,一开始是按照傻瓜式Jar Lib的处理方式,复制XposedBridgeApi-54 ...

  5. Android手势锁实现

    最终效果如下 整体思路 a.自定义了一个RelativeLayout(GestureLockViewGroup)在里面会根据传入的每行的个数,生成多个GestureLockView(就是上面一个个小圈 ...

  6. 【Android Studio使用教程2】Android Studio创建项目

    创建项目 首先,先指出Android Studio中的两个概念. Project 和 Module .在Android Studio中, Project 的真实含义是工作空间, Module 为一个具 ...

  7. Android Studio创建项目

    创建项目 首先,先指出Android Studio中的两个概念. Project 和 Module .在Android Studio中, Project 的真实含义是工作空间, Module 为一个具 ...

  8. Android实现OCR扫描识别数字图片之图片扫描识别

    [Android实例] Android实现OCR扫描识别数字图片之图片扫描识别 Android可以识别和扫描二维码,但是识别字符串呢? google提供了以下解决方案用的是原来HP的相关资料. 可以吧 ...

  9. Android手势源码浅析-----手势绘制(GestureOverlayView)

    Android手势源码浅析-----手势绘制(GestureOverlayView)

随机推荐

  1. paip.提升效率--数据绑定到table原理和流程Angular js jquery实现

    paip.提升效率--数据绑定到table原理和流程Angular js  jquery实现 html #--keyword 1 #---原理和流程 1 #----jq实现的代码 1 #-----An ...

  2. ServiceStack Web Service 创建与调用简单示列

    目录 ServiceStack 概念 ServiceStack Web Service 创建与调用简单示列 上篇文章介绍了ServiceStack是什么,本章进入主题,如何快速简单的搭建Service ...

  3. LLVM和GCC的区别

    最近在Mac OS X Mountain Lion下用Xcode进行开发,发现在编译选项里有如下所示的这两种编译器:一个是Apple LLVM compiler 4.2,另外一个是LLVM GCC 4 ...

  4. Couldn't create temporary file to work with

    Ubuntu中当你编译安装软件的时候可能会出现Couldn't create temporary file to work with,原因可能是: 1.权限问题  2.根目录下没有tmp文件夹 解决办 ...

  5. xcode中嵌入framework(接入快用最新SDK遇到的问题)

      但xcode设置中并没有找到Embed Frameworks这个选项,使用以下方式添加 当遇到dyld: Library not loaded:xxxx  Reason: image not fo ...

  6. 【VerySky原创】如何查找SNRO编号范围的使用情况;

    SAP所有编号范围的对象都可以在表NRIV中找到:

  7. Android——GridView(网格视图)相关知识总结贴

    Android API中文文档GridView http://www.apkbus.com/android-14131-1-1.html   Android API 中文 (15) —— GridVi ...

  8. 源代码安装 MySQL 5.6.28

    本文内容 创建 MySQL 用户和组 解压 MySQL 源代码包 生成配置安装文件 编译和安装 MySQL 配置文件 创建 MySQL 授权表 MySQL 目录授权 启动 MySQL 验证 MySQL ...

  9. Ubuntu 汉化及kate汉化和使用自带终端的解决方式

    汉化方法:1,打开屏幕上方的“system”(系统),里面有个“Administration”(系统管理),选择“Snaptic Package Manager”(软件包管理器),打开,输入密码后进入 ...

  10. Linux文件系统性能优化 (转)

    http://blog.chinaunix.net/uid-7530389-id-2050116.html 由于各种的I/O负载情形各异,Linux系统中文件系统的缺省配置一般来说都比较中庸,强调普遍 ...