Android手勢識別的實現

jopen 11年前發布 | 41K 次閱讀 Android Android開發 移動開發

手勢識別系統:

先把手勢庫放到項目中:(創建手勢庫見下一篇博客)

在res文件夾下新建一個名為raw的文件夾,然后把手勢庫放進去

 

然后開始項目的創建:

 

strings.xml:
    <?xml version="1.0" encoding="utf-8"?>  
    <resources>  

        <string name="app_name">GestureTest</string>  
        <string name="notrecognize">沒有手勢</string>  
        <string name="noprediction">手勢識別率太低,請重新輸入</string>  
        <string name="noloading">手勢庫沒有加載成功</string>  

    </resources>  

main.xml:

    <?xml version="1.0" encoding="utf-8"?>  
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        android:orientation="vertical" >  


        <android.gesture.GestureOverlayView   
            android:id="@+id/myGesture"  
            android:layout_width="fill_parent"  
            android:layout_height="0dip"  
            android:layout_weight="1.0"  
            />  

    </LinearLayout>  

GestureTestActivity.java:

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.util.Log;  
import android.widget.Toast;  

public class GestureTestActivity extends Activity {  

    GestureOverlayView gestureView;  
    GestureLibrary gLibrary;  
    boolean loadState;  

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

        init();  
    }  

    private void init() {  
        gestureView = (GestureOverlayView) this.findViewById(R.id.myGesture);  
        gestureView  
                .addOnGesturePerformedListener(new MyOnGesturePerformedListener());  

        // 創建首飾庫對象GestureLibrary  
        gLibrary = GestureLibraries.fromRawResource(this, R.raw.gestures);  
        // 加載手勢庫資源  
        loadState = gLibrary.load();  
    }  

    private final class MyOnGesturePerformedListener implements  
            OnGesturePerformedListener {  

        public void onGesturePerformed(GestureOverlayView overlay,  
                Gesture gesture) {  
            if (loadState) {//加載手勢資源成功  
                // 獲取畫的圖形進行匹配,匹配程度就是Prediction中的score  
                ArrayList<Prediction> predictions = gLibrary.recognize(gesture);  

                if (!predictions.isEmpty()) {// 如果用戶畫了圖形,就會匹配  

                    Prediction prediction = predictions.get(0);  
                    Log.i("TAG", String.valueOf(prediction.score));  
                    if (prediction.score > 5) {// 判斷相似度大于1,與里面的兩者進行匹配  
                        if ("close".equals(prediction.name)) {//關閉  
                            finish();  
                        } else if ("dialto".equals(prediction.name)) {//打電話  
                            Intent intent = new Intent(Intent.ACTION_CALL,  
                                    Uri.parse("tel:11111111111"));  
                            startActivity(intent);  
                        }  
                    } else {// 相似度小于1,不識別  
                        showToast(R.string.noprediction);  
                    }  
                } else {//沒有畫圖形  
                    showToast(R.string.notrecognize);  
                }  
            } else {  
                showToast(R.string.noloading);  
            }  
        }  
    }  

    private void showToast(int tesId) {  
        Toast.makeText(this, tesId, Toast.LENGTH_LONG).show();  
    }  
}  

效果圖:(必須畫的比較精確)

 

1.gif

 

如果畫c形狀的話,會退出這個程序

 

2.gif

 

如果畫一個對鉤的話,會去進行撥號的操作

來自:http://blog.csdn.net/like7xiaoben/article/details/7172783

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!