Android手势识别入门

1. 建立手势库

       使用SDK自带例子GestureBuilder建立手势库(位置:android-sdk-windows/samples/android-8/GestureBuilder)。

       使用GestureBuilder之前,你需要恢复其到开发环境,然后进行编绎并部署到手机上。

       此时,就可以使用GestureBuilder建立手势库,生成的手势库文件在SCDard上,默认文件名称为:gestures

      

       具体步骤:

              1. 新建一个 Android 项目,项目名称为 GestureBuilder

              2. 进入到 android-sdk-windows/samples/

                 进入到对应的版本 SDK 目录,因为我使用的是 Android2.2。

                 于是再进入到 android-8 目录下,打开 GestureBuilder 项目

              3. 选中 GestureBuilder 项目的 graphics、res、src 文件夹 和 AndroidManifest.xml 文件,复制它们

              4. 再进入到我们自己新建的 GestureBuilder 下,删掉自己的 graphics、res、src 文件夹 和AndroidManifest.xml 文件

                 再将复制的内容粘贴到文件夹下。昨晚这些项目,就相当于将 Android的 例子程序 GestureBuilder 导入进了 eclipse 环境中

                

              5. 然后再将项目部属到模拟器上。出现一个添加手势库的程序。

             

              6. 点击 "Add gesture",就可以添加一个手势。

                 在屏幕上画出一个图形,再在屏幕上方为这个图形输入一个名字。就完成了一个手势的添加。如图:

图一:绘图

                    

               

             图二:主界面,点击 "Add gesture" 和可进入到绘图界面

                   

             

              7. 点击 "Done" 按钮可以保存这个手势到手势库文件

             

              8. 所有添加的手势都被保存到了 SD 卡根目录下的 gestures 手势库文件中。

             

       我添加了两个手势:一个 "勾" 形图形,名称为 "close" ; 一个 "W",名称为 "wjh"。

       在接下来的示例应用中,将用到这两个手势。当在应用中,画出 "勾" 形手势时,将关闭应用。当画出 "W" 手势时,将拨打 wjh 的电话号码。

      

2. 新建 Android 项目: Gesture

   将生成的手势文件导出来,并放置在 Gesture 应用中。

   为了便于查找和使用,在 Gesture 应用的 res 目录下再新建一个 raw 目录,将手势库文件放置在此目录下面。如图:

   

     


3. 界面设计,提供一个场地,使用户可以在此控件上可以画手势

   使用 android.gesture.GestureOverlayView 控件

     <android.gesture.GestureOverlayView

           android:id="@+id/gestures"

           android:layout_width="fill_parent"

           android:layout_height="0dip"

           android:layout_weight="1.0" />

 

4. 当一个手势画完毕后,会触发一个事件

       GestureOverlayView.addOnGesturePerformedListener(OnGesturePerformedListener listener)

   将用户一个手势画完后,就会调用 OnGesturePerformedListener 的 onGesturePerformed 方法。因此我们适合关注此方法,对手势进行识别。

     public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture);

 

5. 加载手势库

       GestureLibrary library = GestureLibraries.fromRawResource(this, R.raw.gestures);

       library.load();

6. 取出匹配集合

       /* 查找手势库中与用户画的手势库有些相似性的手势集合

        * 并按照相似性度高到低排序,与用户画的图形最相似的手势,放在集合第一个位置 */

        ArrayList<Prediction> predictions = library.recognize(gesture);

 

7. 单手势识别 Activity 代码清单:

package com.kelly.gesturedemo;

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.GestureOverlayView.OnGestureListener;
import android.gesture.GestureOverlayView.OnGesturePerformedListener;
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 GestureOverlayView overlayView = null;
	private Gesture mGesture;
	GestureLibrary library;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		library = GestureLibraries.fromRawResource(this, R.raw.gestures);// 得到手势库
		library.load();// 加载

		overlayView = (GestureOverlayView) findViewById(R.id.gestures);

		// 此方法只针对单笔手势
		overlayView
				.addOnGesturePerformedListener(new GesturePerformedListener());

		// 监听单笔 多笔
		overlayView.addOnGestureListener(new GestureListener());
	}

	private final class GestureListener implements 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");
			// 获取最后的手势
			mGesture = overlay.getGesture();
		}

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

	}

	/**
	 * 单笔手势
	 * 
	 * @author Administrator
	 * 
	 */
	private final class GesturePerformedListener implements
			OnGesturePerformedListener {

		public void onGesturePerformed(GestureOverlayView overlay,
				Gesture gesture) {
			recognize(gesture);

		}

	}

	private void recognize(Gesture gesture) {
		ArrayList<Prediction> predictions = library.recognize(gesture);

		if (!predictions.isEmpty()) {
			Prediction prediction = predictions.get(0);
			double score = prediction.score;
			if (score >= 6) {

				if (prediction.name.equals("张凯")) {
					Intent intent = new Intent(Intent.ACTION_CALL,
							Uri.parse("tel:10086"));
					startActivity(intent);
				} else if ("close".equals(prediction.name)) {
					finish();// 关闭Activity

				}

			} else {
				Toast.makeText(getApplicationContext(), "匹配度too low", 1).show();
			}

		} else {
			Toast.makeText(MainActivity.this, "没有发现匹配的手势", 1).show();
		}
	}

	@Override
	protected void onDestroy() {

		super.onDestroy();
		android.os.Process.killProcess(android.os.Process.myPid());// 关闭应用
	}

	public void find(View view) {

		recognize(mGesture);
		overlayView.clear(true);

	}

}

原文:http://blog.163.com/gpf1987@126/blog/static/140401677201212921237657/



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值