在觸摸屏世界中,使用複雜的手勢(如在屏幕上不同方向多點觸摸)是使交互簡單有趣的非常好的方式。從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; }