Android除了提供手势检测之外,还允许把用户手势添加到指定文件中,以备以后使用,当用户再次画出该手势时,系统可识别该手势。Android使用GestureLibrary代表手势库,提供GestureLibraries工具类来创建手势库。GestureLibraries提供如下4个静态方法从不同位置加载手势库:

一旦程序中获得了GestureLibrary对象后,就可以用如下方法来添加、识别手势:

另外Android还提供了一个手势编辑组件:GestureOverlayView,用户可以在上面绘制手势。然后对它绑定事件监听器,响应手势事件开始、结束、完成、取消等事件。下面通过一个简单实例来演示手势的添加以及识别自定义手势,代码如下:

AddGestureActiv:

  1. package com.lovo.activity;
  2.  
  3. import android.app.Activity;
  4. import android.app.AlertDialog;
  5. import android.content.DialogInterface;
  6. import android.content.Intent;
  7. import android.gesture.Gesture;
  8. import android.gesture.GestureLibraries;
  9. import android.gesture.GestureLibrary;
  10. import android.gesture.GestureOverlayView;
  11. import android.gesture.GestureOverlayView.OnGesturePerformedListener;
  12. import android.graphics.Bitmap;
  13. import android.graphics.Color;
  14. import android.os.Bundle;
  15. import android.util.Log;
  16. import android.view.View;
  17. import android.view.View.OnClickListener;
  18. import android.widget.Button;
  19. import android.widget.EditText;
  20. import android.widget.ImageView;
  21.  
  22. import com.lovo.addgesture.R;
  23.  
  24. public class AddGestureActivity extends Activity {
  25. private GestureOverlayView gestureView;
  26.  
  27. @Override
  28. protected void onCreate(Bundle savedInstanceState) {
  29. super.onCreate(savedInstanceState);
  30. setContentView(R.layout.main);
  31. // 获取手势编辑视图
  32. gestureView = (GestureOverlayView) findViewById(R.id.main_gesture);
  33. // 设置手势绘制的颜色
  34. gestureView.setGestureColor(Color.RED);
  35. // 设置手势的绘制宽度
  36. gestureView.setGestureStrokeWidth(4);
  37. // 为 gesture的手势完成事件绑定事件监听器
  38. gestureView.addOnGesturePerformedListener(new OnGesturePerformedListener() {
  39.  
  40. @Override
  41. public void onGesturePerformed(GestureOverlayView overlay,
  42. final Gesture gesture) {
  43. // 加载save.xml界面布局代表的视图
  44. View saveDialog = getLayoutInflater().inflate(R.layout.save, null);
  45. // 获取saveDialog里的show组件
  46. ImageView imageView = (ImageView) saveDialog.findViewById(R.id.save_iv_show);
  47. // 获取saveDialog里的gesture_name组件
  48. final EditText gestureName = (EditText) saveDialog
  49. .findViewById(R.id.save_et_gesture_name);
  50. // 根据Gesture包含的手势创建一个位图
  51. Bitmap bitmap = gesture.toBitmap(128, 128, 10,0xFFFF0000);
  52. imageView.setImageBitmap(bitmap);
  53. // 使用对话框显示saveDialog组件
  54. new AlertDialog.Builder(AddGestureActivity.this)
  55. .setView(saveDialog)
  56. .setPositiveButton("保存",
  57. new android.content.DialogInterface.OnClickListener() {
  58.  
  59. @Override
  60. public void onClick(
  61. DialogInterface dialog,int which) {
  62. // 获取指定文件对应的手势库
  63. GestureLibrary gestureLib = GestureLibraries
  64. .fromFile(AddGestureActivity.this
  65. .getFilesDir()+ "/gestures");
  66. // 添加手势
  67. gestureLib.addGesture(gestureName.getText().toString(),gesture);
  68. // 保存手势库
  69. boolean isSave = gestureLib.save();
  70. String result = isSave ? "保存成功": "保存失败";
  71. Log.i("isSave", result);
  72. }
  73. }).setNegativeButton("取消", null).show();
  74. }
  75. });
  76. Button turnBtn = (Button) findViewById(R.id.main_btn_turn);
  77. turnBtn.setOnClickListener(new OnClickListener() {
  78.  
  79. @Override
  80. public void onClick(View v) {
  81. Intent intent = new Intent(AddGestureActivity.this,
  82. RecogniseGestureActivity.class);
  83. startActivity(intent);
  84. }
  85. });
  86. }
  87. }

Add布局XML:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:layout_gravity="center_horizontal"
  6. android:orientation="vertical" >
  7.  
  8. <LinearLayout
  9. android:layout_width="match_parent"
  10. android:layout_height="wrap_content"
  11. android:orientation="horizontal" >
  12.  
  13. <TextView
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:text="请在下面屏幕上绘制手势" />
  17.  
  18. <Button
  19. android:id="@+id/main_btn_turn"
  20. android:layout_width="wrap_content"
  21. android:layout_height="wrap_content"
  22. android:layout_marginLeft="10dp"
  23. android:text="跳转到手势识别界面" />
  24. </LinearLayout>
  25. <!-- 使用手势绘制组件 -->
  26.  
  27. <android.gesture.GestureOverlayView
  28. android:id="@+id/main_gesture"
  29. android:layout_width="match_parent"
  30. android:layout_height="match_parent"
  31. android:gestureStrokeType="multiple" />
  32.  
  33. </LinearLayout>

识别手势的Activity:

  1. package com.lovo.activity;
  2.  
  3. import java.util.ArrayList;
  4.  
  5. import android.app.Activity;
  6. import android.app.AlertDialog;
  7. import android.gesture.Gesture;
  8. import android.gesture.GestureLibraries;
  9. import android.gesture.GestureLibrary;
  10. import android.gesture.GestureOverlayView;
  11. import android.gesture.GestureOverlayView.OnGesturePerformedListener;
  12. import android.gesture.Prediction;
  13. import android.os.Bundle;
  14. import android.view.View;
  15. import android.view.View.OnClickListener;
  16. import android.widget.ArrayAdapter;
  17. import android.widget.Button;
  18. import android.widget.Toast;
  19.  
  20. import com.lovo.addgesture.R;
  21.  
  22. public class RecogniseGestureActivity extends Activity {
  23. // 定义手势编辑组件
  24. private GestureOverlayView gestureView;
  25. // 记录手机上已有的手势库
  26. GestureLibrary gestureLibrary;
  27.  
  28. @Override
  29. protected void onCreate(Bundle savedInstanceState) {
  30. super.onCreate(savedInstanceState);
  31. setContentView(R.layout.recognise);
  32. // 读取上一个程序所创建的手势库
  33. gestureLibrary = GestureLibraries.fromFile(this.getFilesDir()
  34. + "/gestures");
  35. if (gestureLibrary.load()) {
  36. Toast.makeText(this, "手势文件装载成功!", Toast.LENGTH_SHORT).show();
  37. } else {
  38. Toast.makeText(this, "手势文件装载失败!", Toast.LENGTH_SHORT).show();
  39. }
  40. // 获取手势编辑组件
  41. gestureView = (GestureOverlayView) findViewById(R.id.recognise_gesture);
  42. // 为手势编辑组件绑定事件监听器
  43. gestureView
  44. .addOnGesturePerformedListener(new OnGesturePerformedListener() {
  45.  
  46. @Override
  47. public void onGesturePerformed(GestureOverlayView overlay,
  48. Gesture gesture) {
  49. // 识别用户刚刚所绘制的手势
  50. ArrayList<Prediction> predictions = gestureLibrary
  51. .recognize(gesture);
  52. ArrayList<String> result = new ArrayList<String>();
  53. // 遍历所有找到的Prediction对象
  54. for (Prediction pred : predictions) {
  55. // 只有相似度大于2.0的手势才会被输出
  56. if (pred.score > 2.0) {
  57. result.add("与手势【" + pred.name + "】的相似度为"
  58. + pred.score);
  59. }
  60. }
  61. if (result.size() > 0) {
  62. ArrayAdapter adapter = new ArrayAdapter(
  63. RecogniseGestureActivity.this,
  64. android.R.layout.simple_dropdown_item_1line,
  65. result.toArray());
  66. // 使用一个带List的对话框来显示所有匹配的手势
  67. new AlertDialog.Builder(
  68. RecogniseGestureActivity.this)
  69. .setAdapter(adapter, null)
  70. .setPositiveButton("保存", null).show();
  71. } else {
  72. Toast.makeText(RecogniseGestureActivity.this,
  73. "无法找到匹配的手势!", Toast.LENGTH_SHORT).show();
  74. }
  75.  
  76. }
  77. });
  78. Button turnBtn = (Button) findViewById(R.id.recognise_btn_turn);
  79. turnBtn.setOnClickListener(new OnClickListener() {
  80.  
  81. @Override
  82. public void onClick(View v) {
  83. finish();
  84. }
  85. });
  86. }
  87. }

识别手势的布局XML:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:layout_gravity="center_horizontal"
  6. android:orientation="vertical" >
  7.  
  8. <LinearLayout
  9. android:layout_width="match_parent"
  10. android:layout_height="wrap_content"
  11. android:orientation="horizontal" >
  12.  
  13. <TextView
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:text="请在下面屏幕上绘制手势" />
  17.  
  18. <Button
  19. android:id="@+id/recognise_btn_turn"
  20. android:layout_width="wrap_content"
  21. android:layout_height="wrap_content"
  22. android:layout_marginLeft="10dp"
  23. android:text="返回到增加手势界面" />
  24. </LinearLayout>
  25. <!-- 使用手势绘制组件 -->
  26.  
  27. <android.gesture.GestureOverlayView
  28. android:id="@+id/recognise_gesture"
  29. android:layout_width="match_parent"
  30. android:layout_height="match_parent"
  31. android:gestureStrokeType="multiple" />
  32.  
  33. </LinearLayout>

手势(Gesture)的增加和识别的更多相关文章

  1. android学习笔记52——手势Gesture,增加手势、识别手势

    手势Gesture,增加手势 android除了提供了手势检测之外,还允许应用程序把用户手势(多个持续的触摸事件在屏幕上形成特定的形状)添加到指定文件中,以备以后使用 如果程序需要,当用户下次再次画出 ...

  2. android学习笔记51——SQLite 手势Gesture

    手势Gesture 所谓手势,是指用户手指或触摸笔在触摸屏幕上的连续触碰行为. Androi对两种手势行为都提供了支持: 1.对于第一种手势而言,android提供了手势检测,并为手势检测提供了相应的 ...

  3. 0128——手势Gesture

    UIGestureRecognizer: 1.locationinView 获取手势在某个视图里面的坐标位置 2.delegate监听手势的行为 3.state状态 开始:UIGestureRecog ...

  4. 【转】 iOS开发之手势gesture详解

    原文:http://www.cnblogs.com/salam/archive/2013/04/30/iOS_gesture.html 前言 在iOS中,你可以使用系统内置的手势识别 (Gesture ...

  5. iOS开发之手势gesture详解(一)

    前言 在iOS中,你可以使用系统内置的手势识别(GestureRecognizer),也可以创建自己的手势.GestureRecognizer将低级别的转换为高级别的执行行为,是你绑定到view的对象 ...

  6. iOS开发之手势gesture详解(二)

    与其他用户界面控件交互 UIControl子类会覆盖parentView的gesture.例如当用户点击UIButton时,UIButton会接受触摸事件,它的parentView不会接收到.这仅适用 ...

  7. eoLinker 新功能发布,增加了识别代码注释自动生成文档功能

    产品地址:https://www.eolinker.com开源代码:https://www.eolinker.com/#/os/download在线生成代码注释工具:http://tool.eolin ...

  8. opencv编译:opencv 3.4.1 编译 contrib模块,增加人脸识别

    start cmake-gui select the opencv source code folder and the folder where binaries will be built (th ...

  9. 手势识别(一)--手势基本概念和ChaLearn Gesture Challenge

    以下转自: http://blog.csdn.net/qq1175421841/article/details/50312565 像点击(clicks)是GUI平台的核心,轻点(taps)是触摸平台的 ...

随机推荐

  1. CImageList用法介绍

    图像列表控制(CImageList)是相同大小图像的一个集合,每个集合中均以0为图像的索引序号基数,图像列表通常由大图标或位图构成,其中包含透明位图模式.可以利用WINDOWS32位应用程序接口函数A ...

  2. 如果是在有master上开启了该参数,记得在slave端也要开启这个参数(salve需要stop后再重新start),否则在master上创建函数会导致replaction中断。

    如果是在有master上开启了该参数,记得在slave端也要开启这个参数(salve需要stop后再重新start),否则在master上创建函数会导致replaction中断.

  3. 一次ORA-03113错误解决

    ---------------------------------------------------------------------------- -----------------ORA错误处 ...

  4. 从WinMain开始

    一.抽象渗漏法则 根据Joel的抽象渗漏法则,所有重大的抽象机制在某种程度上都是有漏洞的.Joel举过一个例子: C++字符串类型应该能让你假装字符串是个基本类型,它们尝试“字串很难处理”这个事实抽象 ...

  5. mongodb查询分页优化

    要求不用skip 前提:1.时间倒序排列(自己现在的项目中也是按照时间倒序排列的)       2.每页显示10条数据 int limit = 10;//刚开始点击查询的时候设置十条 查询形式为 db ...

  6. 腾讯文学动作密集 疑为手Q发力移动阅读铺路

        移动互联网的门票之争并未结束,百度收购91无线,阿里投资新浪微博.UC浏览器,网易推易信.云音乐等等,都是互联网巨头争夺移动互联网门票的最佳案例.不过,上述任何巨头都不可忽视腾讯这个“狠角色” ...

  7. C#实现树的双亲表示法

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHVja3k1MTIyMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  8. 那些年我们装过的数据库---盘点sqlserver2008安装时遇到的各种的问题(持续更新中)

    给自己安过sqlServer2008,也给好多同学安过sqlServer2008,期间遇到了好多不同的另人心烦的问题,在这里整理一下,(涉及到的部分方法是在网上找的,有些也没试过,仅仅是在这里整理一下 ...

  9. GitLab 5.3 升级注意事项

    最主要就是需要更新的Git.我的Ubuntu12.04通过apt-get install安装的git版本过低. 所以只能通过源代码安装. 参考下面的步骤: wget git-core.googleco ...

  10. Android开发周报:Flyme OS开源、经典开源项目解析

    Android开发周报:Flyme OS开源.经典开源项目解析 新闻 <魅族Flyme OS源码上线Github> :近日魅族正式发布了MX5,并且在发布会上,魅族还宣布Flyme OS开 ...