讀古今文學網 > Android程序設計:第2版 > 手勢輸入 >

手勢輸入

在觸摸屏世界中,使用複雜的手勢(如在屏幕上不同方向多點觸摸)是使交互簡單有趣的非常好的方式。從Android 1.6(API level 4)開始提供手勢API。在該API中,最簡單的方式是使用android.gesture.GestureOverlayView給應用添加手勢輸入功能:


<!-- an example usage of GestureOverlayView in a layout xml -->
<android.gesture.GestureOverlayView
        xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/gestures"
    android:layout_
    android:layout_
    android:gestureStrokeType="multiple"
    android:eventsInterceptionEnabled="true">
</<android.gesture.GestureOverlayView>
  

GestureOverlayView是一個專門的FrameLayout,你可以在該視圖上放置其他widget,或者包含其他widget。它可以捕捉觸摸屏的筆畫並使用有顏色的線條(默認是黃色)來顯示筆畫。GestureOverlayView.OnGesturePerformedListener接口用來支持對手勢做出響應:


GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures);
gestures.addOnGesturePerformedListener(
                            new GestureOverlayView.OnGesturePerformedListener {
    @Override
    public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
        // do nothing for now
    }
});
  

一旦給出某個手勢,則可以查看Gesture庫看能否識別該手勢。Gesture庫可以使用GestureLibraries類的靜態方法,通過各種方式讀取。加載Gesture庫(加載GestureStore)之後,可以給其傳遞手勢,並使用recognize方法分析它。該方法會返回Predictions列表,每個Prediction包含一個打分和名稱,打分表示和庫內該名稱的手勢的接近程度:


final GestureLibrary library = GestureLibraries.fromFile("/Some/File/Path");
library.load;         // load library
GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures);
gestures.addOnGesturePerformedListener(
                            new GestureOverlayView.OnGesturePerformedListener {
    @Override
    public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
            // do the recognize
        ArrayList<Prediction> predictions = library.recognize(gesture);
        if (predictions.size > 0) {
            for(Prediction prediction: predictions) {
                // the score is high enough that we know it's a hit
                if (prediction.score > 1.0) {
                    // let's show a toast telling us what the gesture is named
                    Toast.makeText(this,
                      prediction.name, Toast.LENGTH_SHORT).show;
                }
            }
        }
    }
});
  

Gesture類的基礎結構中包含多個GestureStroke對象,每個GestureStroke對像由一組GesturePoint對像組成。GesturePoint由(x,y)坐標以及生成該坐標點的時間戳組成。當在GestureStore(在GestureLibrary庫內)中保存Gesture時,把名稱(string)作為密鑰。

在GestureLibrary中增加一個Gesture是非常簡單的。提供和該手勢關聯的名稱和Gesture對象,然後把它保存到GestureLibrary中。注意,庫必須是從外部文件源中讀取的(如SD卡或私有文件),這樣庫才是可修改並可存儲的。從原始資源中讀取的庫是只讀的(使用GestureLibraries.fromRawResource(context,resId)):


public void saveGesture(String name, Gesture gesture) {
    library.addGesture(name, gesture);
    library.save;
}