Step1: 生成一个Android Gusture Builder程序用于画Gusture然后存储起来用于其它的项目

首先导入  android SDK \android-sdk-windows\samples\android-8\   目录下的GestureBuilder项目,用于生成Gusture类库

导入过程中要加入几个文件才能导入到Eclipse中,如下图所示: 这几个文件可以从任意android项目中copy

.classpath    .project   default.properties 3个文件

导入之后生成项目如下图所示:                                                                                                              将该项目安装到模拟器中,如下图所示:

                                                           

step2:应用此程序生成我们需要的手势,点击 Add gesture按钮添加手势,随便添加几个手势之后

然后会在sdcard中生成一个gusture文件  如图所示

step2:将此gusture文件导出到桌面,然后再复制到新建的项目中去

step3:新建项目Gusture,并将刚才的gusture文件导入到/res/raw目录下 ,如下图所示

step4:  设计应用的UI界面,main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="fill_parent"android:layout_height="fill_parent"><android.gesture.GestureOverlayViewandroid:layout_width="fill_parent"android:layout_height="0dp"android:layout_weight="1"android:id="@+id/gesture" android:gestureStrokeType="multiple"/><!-- 多笔手势 --><!-- android:layout_weight="0"  值越低越先赋值 所以先对Button赋值再对android.gesture.GestureOverlayView赋值 --><Button android:layout_width="wrap_content"android:layout_height="wrap_content" android:layout_weight="0"android:text="@string/recognize"android:onClick="findGesture" />
</LinearLayout>

string.xml

<?xml version="1.0" encoding="utf-8"?>
<resources><string name="hello">Hello World, MainActivity!</string><string name="app_name">手势识别</string><string name="notfind">手势不匹配</string><string name="notfull">手势匹配度太低</string><string name="recognize">识别</string>
</resources>

step5:MainActivity.java

package cn.roco.gesture;import java.util.ArrayList;import android.app.Activity;
import android.content.Intent;
import android.gesture.Gesture;
import android.gesture.GestureLibraries;
import android.gesture.GestureLibrary;
import android.gesture.GestureOverlayView;
import android.gesture.Prediction;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;public class MainActivity extends Activity {private static final String TAG="MainActivity";private GestureLibrary library;private Gesture mygesture;private GestureOverlayView gestureOverlayView ;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);/** 根据放入到res/raw/目录下的gestures文件生成GestureLibrary手势库 */library = GestureLibraries.fromRawResource(this, R.raw.gestures);/**加载手势库*/library.load();gestureOverlayView = (GestureOverlayView) this.findViewById(R.id.gesture);/**只能监听单笔手势*//*   gestureOverlayView.addOnGesturePerformedListener(new MyGesturePerformedListener());*//**可以监听单笔手势也可以监听多笔手势*/gestureOverlayView.addOnGestureListener(new MyGestureListener());}/*** 处理按钮响应的方法* 点击识别按钮 开始识别手势*/public void findGesture(View view){recognizeGesture(mygesture);//清除画出的手势gestureOverlayView.clear(true);}private final class MyGestureListener implements android.gesture.GestureOverlayView.OnGestureListener{@Overridepublic void onGestureStarted(GestureOverlayView overlay,MotionEvent event) {Log.i(TAG, "onGestureStarted");}@Overridepublic void onGesture(GestureOverlayView overlay, MotionEvent event) {Log.i(TAG, "onGesture");}@Overridepublic void onGestureEnded(GestureOverlayView overlay, MotionEvent event) {Log.i(TAG, "onGestureEnded");/**取得用户最后画完后的手势*/mygesture=overlay.getGesture();}@Overridepublic void onGestureCancelled(GestureOverlayView overlay,MotionEvent event) {Log.i(TAG, "onGestureCancelled");}}/*** 用户绘制完手势后响应*/private final class MyGesturePerformedListener implementsandroid.gesture.GestureOverlayView.OnGesturePerformedListener {@Overridepublic void onGesturePerformed(GestureOverlayView overlay,Gesture gesture) {recognizeGesture(gesture);}}/**识别手势*/private void recognizeGesture(Gesture gesture) {/*** 从手势库中查询匹配的内容, 匹配结果可能包含多个相似的内容,* 匹配度高的结果放在最前面 */ArrayList<Prediction> predictions = library.recognize(gesture);if (!predictions.isEmpty()) {Prediction prediction=predictions.get(0);if (prediction.score>=6) {   //匹配度大于等于60%if ("ouyang".equals(prediction.name)) {/**调用手机拨号程序*/Intent intent=new Intent(Intent.ACTION_CALL,Uri.parse("tel:15245474568"));startActivity(intent);}else if("close".equals(prediction.name)){finish();//关闭Activity   会引发onDestory方法}}else{//手势匹配度太低Toast.makeText(getApplicationContext(), R.string.notfull, 1).show();}} else {//不匹配Toast.makeText(getApplicationContext(), R.string.notfind, 1).show();}}@Overrideprotected void onDestroy() {super.onDestroy();/**          杀掉本应用的进程* 第一种方法:首先获取当前进程的id,如何杀死该进程 */android.os.Process.killProcess(android.os.Process.myPid());//关闭应用/*** 关闭应用还有2种方法* * 第二种方法:终止当前正在运行的Java虚拟机,导致程序终止*   System.exit(0);*   *   * 第三种方法:强制关闭与该包有关联的一切执行*    android.app.ActivityManager manager=(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);manager.restartPackage(getPackageName());还要添加权限才行     <uses-permission android:name="android.permission.RESTART_PACKAGES"/>*/
}
} 

step6:AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="cn.roco.gesture"android:versionCode="1"android:versionName="1.0"><uses-sdk android:minSdkVersion="8" /><!-- 拨打电话的权限 --><uses-permission android:name="android.permission.CALL_PHONE"/><application android:icon="@drawable/icon" android:label="@string/app_name"><activity android:name=".MainActivity"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application>
</manifest>

step7:将项目部署到模拟器中,如果所示界面:

            

然后画手势 点击“识别”按钮进行识别   上面的时候一点击  就退出了此应用

                            

然后画手势 点击“识别”按钮进行识别 就激活了拨号程序进行拨号

                         

然后画手势 点击“识别”按钮进行识别 显示匹配度太低

附注:自己写一个添加手势的应用

AddGesture.java

package cn.roco.gesture;import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.gesture.Gesture;
import android.gesture.GestureLibraries;
import android.gesture.GestureLibrary;
import android.gesture.GestureOverlayView;
import android.gesture.GestureOverlayView.OnGesturePerformedListener;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
/*** 添加手势*/
public class AddGesture extends Activity {EditText editText;GestureOverlayView gestureOverlayView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.addgesture);// 获取文本编辑器editText = (EditText) findViewById(R.id.gesture_name);// 获取手势编辑视图gestureOverlayView = (GestureOverlayView) findViewById(R.id.gesture);// 设置手势的绘制颜色gestureOverlayView.setGestureColor(Color.RED);// 设置手势的绘制宽度gestureOverlayView.setGestureStrokeWidth(4);// 为 gesture的手势完成事件绑定事件监听器gestureOverlayView.addOnGesturePerformedListener(new OnGesturePerformedListener() {@Overridepublic void onGesturePerformed(GestureOverlayView overlay,final Gesture gesture) {// 加载save.xml界面布局代表的视图View saveDialog = getLayoutInflater().inflate(R.layout.save, null);// 获取 saveDialog里的ImageView组件ImageView imageView = (ImageView) saveDialog.findViewById(R.id.show);// 获取 saveDialog里的 EditText组件final EditText gestureName = (EditText) saveDialog.findViewById(R.id.gesture_name);// 根据 Gesture包含的手势创建一个位图Bitmap bitmap = gesture.toBitmap(128, 128, 10,0xFFFF0000);imageView.setImageBitmap(bitmap);// 使用对话框显示saveDialog组件new AlertDialog.Builder(AddGesture.this).setView(saveDialog).setPositiveButton("保存", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog,int which) {// 获取指定的文件对应的手势库GestureLibrary gestureLibrary = GestureLibraries.fromFile("/sdcard/gestures");// 添加手势gestureLibrary.addGesture(gestureName.getText().toString(), gesture);// 保存手势库gestureLibrary.save();Toast.makeText(getApplicationContext(), "保存成功", 1).show();}}).setNegativeButton("取消", null).show();}});}
}

addgesture.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="fill_parent"android:layout_height="fill_parent"><TextView android:text="请在下面屏幕上绘制手势" android:layout_width="fill_parent"android:layout_height="wrap_content" /><!-- 使用手势绘制组件 --><android.gesture.GestureOverlayViewandroid:layout_width="fill_parent" android:layout_height="fill_parent"android:layout_weight="1" android:id="@+id/gesture"android:gestureStrokeType="multiple" /><!-- 多笔手势 -->
</LinearLayout>

save.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="fill_parent"android:layout_height="fill_parent"><LinearLayout android:orientation="horizontal"android:layout_width="fill_parent" android:layout_height="wrap_content"><TextView android:text="请输入保存的手势名称"android:layout_marginRight="8dip" android:layout_width="wrap_content"android:layout_height="wrap_content" /><!-- 定义一个文本框来让用户输入手势名 --><EditText android:layout_width="fill_parent"android:layout_height="wrap_content" android:id="@+id/gesture_name" /></LinearLayout><ImageView android:id="@+id/show" android:layout_marginTop="10dp"android:layout_width="128dp" android:layout_height="128dp " />
</LinearLayout>

                                   

==================================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址:http://blog.csdn.net/ouyang_peng

==================================================================================================


转载于:https://www.cnblogs.com/ouyangpeng/archive/2013/04/12/8538404.html

我的Android进阶之旅------Android Gusture 手势识别小案例相关推荐

  1. 我的Android进阶之旅------Android利用Sensor(传感器)实现水平仪功能的小例

    这里介绍的水平仪,指的是比较传统的气泡水平仪,在一个透明圆盘内充满液体,液体中留有一个气泡,当一端翘起时,该气泡就会浮向翘起的一端.    利用方向传感器返回的第一个参数,实现了一个指南针小应用.   ...

  2. 我的Android进阶之旅------Android利用温度传感器实现带动画效果的电子温度计

    要想实现带动画效果的电子温度计,需要以下几个知识点: 1.温度传感器相关知识. 2.ScaleAnimation动画相关知识,来进行水印刻度的缩放效果. 3.android:layout_weight ...

  3. android服务进阶,我的Android进阶之旅------Android服务的生命周期回调方法

    先引用一段官网上的文字 ======================================================================================== ...

  4. 我的Android进阶之旅------Android二级ListView列表的实现

    实现如下图所示的二级列表效果 首先是在布局文件中,布局两个ListView,代码如下: <LinearLayout xmlns:android="http://schemas.andr ...

  5. 我的Android进阶之旅------Android嵌入图像InsetDrawable的用法

    面试题:为一个充满整个屏幕的LinearLayout布局指定背景图,是否可以让背景图不充满屏幕?请用代码描述实现过程. 解决此题,可以使用嵌入(Inset)图像资源来指定图像,然后像使用普通图像资源一 ...

  6. 我的Android进阶之旅------Android项目目录结构分析

    此文章来自"博客园"博主,仅在此借鉴,学习 1.HelloWorld项目的目录结构 1.1.src文件夹 1.2.gen文件夹 1.3.Android 2.1文件夹 1.4.ass ...

  7. 我的Android进阶之旅------Android自定义View来实现解析lrc歌词并同步滚动、上下拖动、缩放歌词的功能...

    前言 一LRC歌词文件简介 1什么是LRC歌词文件 2LRC歌词文件的格式 LRC歌词文件的标签类型 1标识标签 2时间标签 二解析LRC歌词 1读取出歌词文件 2解析得到的歌词内容 1表示每行歌词内 ...

  8. 我的Android进阶之旅------android Matrix图片随意的放大缩小,拖动(转)

    step1:新建一个项目DragAndZoom,并准备一张照片放在res/drawable-hdpi目录下,如下图所示: step2: 设置应用的UI界面,在main.xml中设置: [html] v ...

  9. 我的Android进阶之旅------Android中高低API版本兼容使用@TargetApi或者@SuppressLint(NewApi)...

    Android中高低API版本兼容使用@TargetApi或者@SuppressLint("NewApi") 例如:AndroidManifest.xml中,我们配置了sdk版本的 ...

最新文章

  1. libwebsockets / vs2019 编译 libwebsockets 4.0 方法
  2. 计算机图形学在GIS中的应用,GIS在交通中的应用与发展
  3. 持续集成之 Nuget 进阶
  4. PHP错误:Warning: preg_replace() [function.preg-replace]: Unknown modifier '[' in
  5. Rust : 如何use本地化crate与 dependencies 和 path
  6. 搭建一个自己的文件上传服务器。
  7. PHP常用函数归类总结【大全】
  8. 【开源】Java身份证号码识别系统
  9. Python爬虫用到的一些浏览器代理标识
  10. Halcon threshold详解
  11. type c 网卡 外接网卡 禁用后 不见 消失 找不到 的解决办法
  12. 倍福--控制汇川伺服无法使能分析
  13. AVFoundation 学习资源列表
  14. hooper篮球意思_这些篮球术语都什么意思?
  15. 张近东的大商之道:企业价值在于“为别人所用” | 一点财经
  16. 瑞隆源SMD3225气体放电管(GDT)系列
  17. WGCNA分析基本教程总结
  18. cocos2d-x 颜色混合
  19. 中国三维声图像传感器行业市场供需与战略研究报告
  20. 集成底座统一认证配置说明

热门文章

  1. Qt学习(六):UDP通信
  2. 刷magisk模块后不能开机_联想启天商用电脑刷BIOS或维修换主板后 开机叫两声处理办法...
  3. linux下载文件一直超时,Linux下connect超时处理(总结)
  4. qt web混合编程_QT做界面真是绝美,并且还可嵌入HTML与JS做界面(许多案例)
  5. 我开的慕课《机器学习》突破了1万人,回答几个问题
  6. 等了一个月,我主讲的课程《机器学习》在中国大学慕课开课了!
  7. 【深度学习】PyTorch深度学习技术生态
  8. 【Python基础】Python之collections库-Counter
  9. 【深度学习】煮酒论英雄:深度学习CV领域最瞩目的top成果总结
  10. 下载量过百万的吴恩达机器学习和深度学习笔记更新了!(附PDF下载)