`

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  代码清单:

      

  1. public   class  MainActivity  extends  Activity {  
  2.            private  GestureLibrary library;  
  3.            @Override   
  4.            public   void  onCreate(Bundle savedInstanceState) {  
  5.                super .onCreate(savedInstanceState);  
  6.                setContentView(R.layout.main);  
  7.                 
  8.                GestureOverlayView gestureView = (GestureOverlayView) findViewById(R.id.gestures);  
  9.                gestureView.addOnGesturePerformedListener(new  GestureListener());  
  10.                /* 加载手势库 */   
  11.                library = GestureLibraries.fromRawResource(this , R.raw.gestures);  
  12.                library.load();  
  13.            }  
  14.             
  15.            private   final   class  GestureListener  implements  OnGesturePerformedListener {  
  16.                      @Override   
  17.                      public   void  onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {  
  18.                             /* 查找手势库中与用户画的手势库有些相似性的手势集合  
  19.                              * 并按照相似性度高到低排序,与用户画的图形最相似的手势,放在集合第一个位置 */   
  20.                              ArrayList<Prediction> predictions = library.recognize(gesture);  
  21.                                
  22.                              if (predictions !=  null  && !predictions.isEmpty()) {  
  23.                                     // 第0个手势是最匹配的手势   
  24.                                     Prediction prediction = predictions.get(0 );  
  25.                                     // prediction.score 是相似度,是一个大于0、小于10的双精度数值,1就是10%相似,3就是30%相似度。   
  26.                                     if (prediction.score >  1 ) {  
  27.                                            if ( "close" .equals(prediction.name)) {  
  28.                                                   finish();  
  29.                                            } else   if ( "wjh" .equals(prediction.name)) {  
  30.                                                   Uri uri = Uri.parse("tel:10086" );  
  31.                                                   Intent intent = new  Intent(Intent.ACTION_CALL, uri);  
  32.                                                   startActivity(intent);  
  33.                                            }  
  34.                                     } else  {  
  35.                                            Toast.makeText(getApplicationContext(), "手势不能识别" 1 ).show();  
  36.                                     }  
  37.                              }  
  38.                      }  
  39.            }  
  40.             
  41.            /**  
  42.             * 销毁  Activity ,并关闭应用  
  43.             */   
  44.            @Override   
  45.            protected   void  onDestroy() {  
  46.                   android.os.Process.killProcess(android.os.Process.myPid());  
  47.                   super .onDestroy();  
  48.            }  
  49.        }  
 

             

        AndroidManifest.xml  添加拨打电话权限

        

  1. <? xml   version = "1.0"   encoding = "utf-8" ?>   
  2.               < manifest   xmlns:android = "http://schemas.android.com/apk/res/android"   
  3.                     package = "wjh.android.gesture" line-height: 18px; margin: 0
    分享到:
    评论

相关推荐

Global site tag (gtag.js) - Google Analytics