使用一些浏览器或者输入法应用时会有一些手势操作,还可以自定义手势。这些神奇的操作是怎么做的呢?这一篇重点记录手势的识别和创建。这篇的内容使用到的是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. Java CAS 和ABA问题

    独占锁:是一种悲观锁,synchronized就是一种独占锁,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁. 乐观锁:每次不加锁,假设没有冲突去完成某项操作,如果因为冲突失败就重试,直到成功 ...

  2. crossplatform---electron Quick Start

    Electron enables you to create desktop applications with pure JavaScript by providing a runtime with ...

  3. atitit.客户端连接oracle数据库的方式总结

    客户端连接oracle数据库的方式总结 目录 Java程序连接一般使用jar驱动连接..... 桌面GUI一般采取c语言驱动oci.dll 直接连接... 间接连接(需要配置tns及其envi var ...

  4. xib与nib的区别

    xib和nib都是Interface Builder的图形界面设计文档,nib这个名字来自于NeXTSTEP系统,在NeXTSTEP被Apple收购之前,一直使用nib作为Interface Buil ...

  5. iOS开发——高级技术&地图功能的实现

    地图功能的实现 因为有个项目要在地图中显示位置,所以用到了MapKit. 记录下来,以免以后忘记. 加入MapKit library 首先得在项目中加入MapKit,如图 MapView 先增加一个V ...

  6. Abstract Server模式,Adapter模式和Bridge模式

    简易的台灯 Abstract Server模式 谁拥有接口. 接口属于它的客户,而不是它的派生类. 接口和客户之间的逻辑关系,强于接口和其派生类的逻辑关系. 逻辑关系和实体关系的强度是不一致的.在实体 ...

  7. Python类

    在类的变量前面加 _ _ 是私有变量,外部不可访问. 需要注意的是,在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是 ...

  8. win7给C盘扩容

    win7给C盘扩容 需要给C盘在不重装系统的情况下进行扩容.在网上搜索了不少资料,包括使用系统自带的分区工具,PQ等软件,都没有成功.不小心看到了分区助手,使用之,迅速的解决了问题,而且解决的非常完美 ...

  9. Android SDK Tools Platform-tools Build-tools

    (1)Android SDK (Android SDK主安装包,包含SDK Manager.AVD Manager.工具包tools,释放后的根文件夹为android-sdk-windows): re ...

  10. set global show_compatibility_56 = on;永久生效MySQL重启

    1. 找到MySQL的配置文件,一般在MySQL的安装目录下,例如我的: C:\Program Files\MySQL\MySQL Server 5.7 ,打开下面的一个配置文件: my-defaul ...