Android深入探究笔记--手势识别

知识不分你我。转载自:http://blog.163.com/gpf1987@126/blog/static/140401677201212921237657/

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 项目的 graphicsressrc 文件夹  AndroidManifest.xml 文件,复制它们

              4. 再进入到我们自己新建的 GestureBuilder 下,删掉自己的 graphicsressrc 文件夹 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.mapuni.ryuan.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.GestureOverlayView.OnGesturePerformedListener;
import android.gesture.Prediction;
import android.net.Uri;
import android.os.Bundle;
import android.widget.Toast;

public class GestureActivity extends Activity {
    private GestureLibrary library;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        GestureOverlayView gestureView = (GestureOverlayView) findViewById(R.id.gestures);
        gestureView.addOnGesturePerformedListener(new GestureListener());
        /* 加载手势库 */
        library = GestureLibraries.fromRawResource(this, R.raw.gestures);
        library.load();
    }

    /**
     * 手势监听器
     * @author Administrator
     *
     */
    private final class GestureListener implements OnGesturePerformedListener {
        @Override
        public void onGesturePerformed(GestureOverlayView overlay,
                Gesture gesture) {
            /*
             * 查找手势库中与用户画的手势库有些相似性的手势集合 并按照相似性度高到低排序,与用户画的图形最相似的手势,放在集合第一个位置
             */
            ArrayList<Prediction> predictions = library.recognize(gesture);

            if (predictions != null && !predictions.isEmpty()) {
                // 第0个手势是最匹配的手势
                Prediction prediction = predictions.get(0);
                // prediction.score 是相似度,是一个大于0、小于10的双精度数值,1就是10%相似,3就是30%相似度。
                if (prediction.score > 4) {
                    if ("ok".equals(prediction.name)) {
                        Toast.makeText(getApplicationContext(), "You Said OK", 1).show();
                    } else if ("cancel".equals(prediction.name)) {
                        Toast.makeText(getApplicationContext(), "You Said Cancel", 1).show();
                        /*Uri uri = Uri.parse("tel:10086");
                        Intent intent = new Intent(Intent.ACTION_CALL, uri);
                        startActivity(intent);*/
                    }
                } else {
                    Toast.makeText(getApplicationContext(), "手势不能识别", 1).show();
                }
            }
        }
    }

    /**
     * 销毁 Activity ,并关闭应用
     */
    @Override
    protected void onDestroy() {
        android.os.Process.killProcess(android.os.Process.myPid());
        super.onDestroy();
    }

}

 

posted @ 2012-10-30 08:47  Liu Siyuan  阅读(440)  评论(0编辑  收藏  举报