android中手勢識別的實現

第一步:建立手勢庫

使用SDK自帶例子GestureBuilder建立手勢庫(位置:android-sdk-windows\samples\android-8\GestureBuilder)。使用GestureBuilder之前,你需要恢復其到開發環境,然後進行編繹並部署到手機上。此時,就可以使用GestureBuilder建立手勢庫,生成的手勢庫文件在SCDard上,默認文件名稱爲:gestures

第二步:在應用中加載手勢庫文件,然後開發手勢識別代碼。

把手勢庫文件gestures文件拷貝到項目的res/raw目錄下。然後在佈局文件中添加用於手勢繪製的View:

<android.gesture.GestureOverlayView

    android:id="@+id/gestures"

    android:layout_width="fill_parent“ android:layout_height="0dip"

    android:layout_weight="1.0" />

爲View添加手勢監聽事件:gestureOverlayView.addOnGesturePerformedListener();

得到手勢庫:mLibrary = GestureLibraries.fromRawResource(this, R.raw.gestures);

加載手勢庫:mLibrary.load();

List<Prediction> predictions = mLibrary.recognize(gesture);//從手勢庫中查詢匹配的內容,匹配的結果可能包括多個相似的內容,匹配度高的結果放在最前面

大多數情況下,手勢都是通過一筆完成。然而有一些特別的需求就需要通過多個筆畫來實現,這時可以使用gestureStrokeType屬性進行設置:android:gestureStrokeType="multiple"

String文件:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <resources> 
  3.  
  4.     <string name="app_name">GestureTest</string> 
  5.     <string name="notrecognize">不能識別該手勢</string> 
  6.     <string name="noprediction">手勢識別率太低,請重新輸入</string> 
  7.  
  8. </resources> 


佈局文件:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:layout_width="fill_parent" 
  4.     android:layout_height="fill_parent" 
  5.     android:orientation="vertical" > 
  6.  
  7.     <android.gesture.GestureOverlayView  
  8.         android:id="@+id/myGestureView" 
  9.         android:layout_width="fill_parent" 
  10.         android:layout_height="0dip" 
  11.         android:layout_weight="1.0" 
  12.         /> 
  13.  
  14. </LinearLayout> 


Java文件:

  1. package cn.class3g.gesture; 
  2.  
  3. import java.util.ArrayList; 
  4.  
  5. import android.app.Activity; 
  6. import android.content.Intent; 
  7. import android.gesture.Gesture; 
  8. import android.gesture.GestureLibraries; 
  9. import android.gesture.GestureLibrary; 
  10. import android.gesture.GestureOverlayView; 
  11. import android.gesture.GestureOverlayView.OnGesturePerformedListener; 
  12. import android.gesture.Prediction; 
  13. import android.net.Uri; 
  14. import android.os.Bundle; 
  15. import android.util.Log; 
  16. import android.widget.Toast; 
  17.  
  18. public class GestureTestActivity extends Activity { 
  19.  
  20.     GestureOverlayView getstureView; 
  21.     GestureLibrary gLibrary; 
  22.     boolean loadState = true
  23.  
  24.     public void onCreate(Bundle savedInstanceState) { 
  25.         super.onCreate(savedInstanceState); 
  26.         setContentView(R.layout.main); 
  27.  
  28.         init(); 
  29.  
  30.     } 
  31.  
  32.     private void init() { 
  33.         getstureView = (GestureOverlayView) this 
  34.                 .findViewById(R.id.myGestureView); 
  35.         getstureView 
  36.                 .addOnGesturePerformedListener(new MyOnGesturePerformedListener()); 
  37.  
  38.         // 創建手勢庫對象GestureLibrary 
  39.         gLibrary = GestureLibraries.fromRawResource(this, R.raw.gestures); 
  40.         // 加載手勢庫資源 
  41.         loadState = gLibrary.load(); 
  42.  
  43.     } 
  44.  
  45.     private final class MyOnGesturePerformedListener implements 
  46.             OnGesturePerformedListener { 
  47.  
  48.         public void onGesturePerformed(GestureOverlayView overlay, 
  49.                 Gesture gesture) { 
  50.             if (loadState) { 
  51.                 ArrayList<Prediction> predictions = gLibrary.recognize(gesture); 
  52.  
  53.                 if (!predictions.isEmpty()) { 
  54.                     Prediction prediction = predictions.get(0); 
  55.  
  56.                     Log.i("TAG", String.valueOf(prediction.score)); 
  57.  
  58.                 if (prediction.score > 5) {//如果是1的話太容易失敗,本人測試5比較合適 
  59.                         if ("close".equals(prediction.name)) { 
  60.                             finish();//實現關閉功能,用的是activity自帶的 
  61.                         } else if ("dialto".equals(prediction.name)) { 
  62.                             //實現播出固定電話的功能,記得添加權限 
  63.                             Intent intent = new Intent(Intent.ACTION_CALL, 
  64.                                     Uri.parse("tel:13333333333")); 
  65.                             startActivity(intent); 
  66.                         } 
  67.                     } 
  68.  
  69.                 } else
  70.                     showToast(R.string.notrecognize); 
  71.                 } 
  72.  
  73.             } else
  74.                 showToast(R.string.noprediction); 
  75.             } 
  76.  
  77.         } 
  78.  
  79.     } 
  80.  
  81.     private void showToast(int resId) { 
  82.         Toast.makeText(this, resId, Toast.LENGTH_LONG).show(); 
  83.     } 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章