我的Android进阶之旅------>Android Gusture 手势识别小案例

简介:   Step1: 生成一个Android Gusture Builder程序用于画Gusture然后存储起来用于其它的项目   首先导入  android SDK \android-sdk-windows\samples\android-8\   目录下...

 

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.GestureOverlayView
		android: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. */
	@Override
	public 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{
		@Override
		public void onGestureStarted(GestureOverlayView overlay,
				MotionEvent event) {
			Log.i(TAG, "onGestureStarted");
		}

		@Override
		public void onGesture(GestureOverlayView overlay, MotionEvent event) {
			Log.i(TAG, "onGesture");
		}

		@Override
		public void onGestureEnded(GestureOverlayView overlay, MotionEvent event) {
			Log.i(TAG, "onGestureEnded");
			
			/**取得用户最后画完后的手势*/
			mygesture=overlay.getGesture();
		}

		@Override
		public void onGestureCancelled(GestureOverlayView overlay,
				MotionEvent event) {
			Log.i(TAG, "onGestureCancelled");
		}
		
	}
	

	/**
	 * 用户绘制完手势后响应
	 */
	private final class MyGesturePerformedListener implements
			android.gesture.GestureOverlayView.OnGesturePerformedListener {
		@Override
		public 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();
		}
	}
	
	@Override
	protected 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;

	@Override
	protected 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() {
					@Override
					public 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() {
									@Override
									public 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.GestureOverlayView
		android: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

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


相关文章
|
8月前
|
监控 Android开发 C语言
深度解读Android崩溃日志案例分析2:tombstone日志
深度解读Android崩溃日志案例分析2:tombstone日志
657 0
|
数据库连接 数据库 Android开发
Android -- Room简化数据库设置图书案例
Android -- Room简化数据库设置图书案例
55 0
|
8月前
|
API Android开发
Android高手进阶教程(十五)之---通过Location获取Address的使用!
Android高手进阶教程(十五)之---通过Location获取Address的使用!
83 1
|
6月前
|
Java Android开发 Spring
Android Spingboot 实现SSE通信案例
【7月更文挑战第14天】以下是使用Android和Spring Boot实现SSE(Server-Sent Events)通信的案例摘要: 在`MainActivity`中: - 初始化界面元素并设置按钮点击事件。 - `startSseRequest`方法创建`WebClient`对象,设置请求头,发送请求,并处理响应和错误。 请确保将`your-server-url`替换为实际的服务器地址。
153 14
|
7月前
|
JSON Java API
【Android】使用 Retrofit2 发送异步网络请求的简单案例
**摘要:** Retrofit是Android和Java的HTTP客户端库,简化了RESTful API交互。它通过Java接口定义HTTP请求,并提供注解管理参数、HTTP方法等。要使用Retrofit,首先在AndroidManifest.xml中添加`INTERNET`权限,然后在`build.gradle`中引入Retrofit和Gson依赖。创建服务器响应数据类和描述接口的接口,如`Result`和`Api`。通过Retrofit.Builder配置基础URL并构建实例,之后调用接口方法创建Call对象并发送异步请求。
249 1
|
7月前
|
存储 算法 Java
Android 进阶——代码插桩必知必会&ASM7字节码操作
Android 进阶——代码插桩必知必会&ASM7字节码操作
331 0
|
8月前
|
缓存 网络协议 Java
挑战全网,史上最全Android开发进阶,跳槽复习指南(1),掌握这6大技能体系
挑战全网,史上最全Android开发进阶,跳槽复习指南(1),掌握这6大技能体系
|
8月前
android-agent-web中js-bridge案例
android-agent-web中js-bridge案例
126 2
|
8月前
|
算法 安全 Java
2024年Android最新知识体系最强总结(全方面覆盖Android知识结构,BAT面试&学习进阶)
2024年Android最新知识体系最强总结(全方面覆盖Android知识结构,BAT面试&学习进阶)
|
8月前
|
设计模式 Android开发 Java
实战案例,精选Android面试真题集锦
实战案例,精选Android面试真题集锦