2D Gesten und Android

Android hat eine eingebaute API, um 2D Gesten einzugeben und erkennen zu lassen. Diese Beschreibung ist angelehnt an den ausführlichen Artikel auf den Android Developer Seiten.

Gesture Bulder

Mit der Android Applikation "Gesture Builder" lassen sich Gesten eingeben und einen Namen zuweisen. Andere Android-Programme können dann Gesten erkennen, die mit Gesture Builder eingegeben wurden.

Gesture Bilder

Gestures Builder speichert die Gestendefinitionen in einer Datei auf dem Android-Telefon. Will man diesen Dateinamen ändern oder verschiedene Gestendefinitionen speichern, kann man im Quellcode von Gesture Builder den Dateinamen ändern, und zwar in der Quelldatei "GestureBuilderActivity.java":

private final File mStoreFile = new File(Environment.getExternalStorageDirectory(), "gestures");

Hier kann man "gestures" gegen einen eigenen namen austauschen.

Gesture Builder können Sie in Form eines Eclipse-Projektarchivs hier herunterladen.

2D Gestenerkennung ausprobieren

Mit Gesture Builder definierte Gesten können Sie mit der der von uns modifizierten "GestureDemo" Applikation ausprobieren. Die Applikation gibt nach Eingabe einer Geste eine Rückmeldung über die erkannte Geste:

"GestureDemo" können Sie hier herunterladen.

2D Gestenerkennung in eigene Applikationen integrieren

Um in eine eigene Applikation eine 2D Gestenerkennung einzubetten sind nur vier Schritte erforderlich:

  1. die Gestenbibliothek laden
  2. im XML Layout ein "GestureOverlayView" definieren
  3. einen "GesturePerformed"-Listener für den GestureOverlayView zu registrieren
  4. eine Handler-Methode für Gesture-Events zu implementieren. Im folgenden werden die notwendigen Schritte nochmals im Detail beschrieben.

Laden der Gestenbibliothek

Die Gestenbibliothek lässt sich wie folgt laden:

  File mStoreFile = new File(Environment.getExternalStorageDirectory(), "gestures");
  mLibrary = GestureLibraries.fromFile(mStoreFile);
        if (!mLibrary.load()) {
           finish();
        }

Bitte beachten Sie, dass der Dateinamen mit dem der von GestureBuilder erzeugten Gestendatei übereinstimmen muss. Falls Sie also in GestureBuilder in eine Datei "gestures" abspeichern, so muss diese Datei in ihrer eigenen Anwendung auch wieder geladen werden.

Definieren eines GestureOverlayView

Einen GestureOverlayView fügt man wie folgt ins XML-Layout ein:

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

Es ist auch möglich nur einem spezifischen View die Fähigkeit zu geben, Gesten zu erkennen, indem man ihn in einem GestureOverlayView einbettet:

<android.gesture.GestureOverlayView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/gestures"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    
    android:gestureStrokeType="multiple"
    android:eventsInterceptionEnabled="true"
    android:orientation="vertical">

    <ListView
        android:id="@android:id/list"  
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"  />

</android.gesture.GestureOverlayView>

Registrieren eines Listeners für Gesteneingabeevents

Ein Listener reagiert auf Ereignisse ("Events"), die vom Android-Framework an ihn weitergeleitet werden. Im folgenden Beispiel wird erst eine Referenz auf den GestureOverlayView gesucht und dann registriert sich eine Java-Klasse ("this") als Listener für Gesteneingabeevents:

GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures);
gestures.addOnGesturePerformedListener(this);

Implementieren eines Handlers für Gesteneingabeevents

Ein Handler ist eine Funktion, die bei Auftreten eines Events benachrichtigt wird, und somit auf den Event aufbauend weitere Programmbefehle ausführen kann.

Die nachfolgende Funktion "onGesturePerformed" verarbeitet eine Gesteneingabe. Dafür fragt sie zunächst die Gestenbibliothek ("mLibrary"), die Geste zu erkennen. Es werden eine Anzahl von Vorhersagen ("Predictions") als ArrayList zurückgeliefert, in denen die Gestenbibliothek mögliche Treffer speichert.

Der erste if-Block prüft ob es überhaupt eine Geste gab (predictions.size()>0), und wenn ja prüft der zweite if-Block, ob mit einer genügend hohen Genauigkeit ("Score") die Geste erkannt wurde.

public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
    ArrayList<prediction> predictions = mLibrary.recognize(gesture);

    // We want at least one prediction
    if (predictions.size() > 0) {
        Prediction prediction = predictions.get(0);
        // We want at least some confidence in the result
        if (prediction.score > 1.0) {
            // Show the spell
            Toast.makeText(this, prediction.name, Toast.LENGTH_SHORT).show();
        }
    }
}

-- SvenKratz - 29 Mar 2011

Topic attachments
I Attachment Action Size Date Who Comment
GestureBuilder.zipzip GestureBuilder.zip manage 1598.6 K 29 Mar 2011 - 16:51 SvenKratz Gesture Builder Eclipse Project
GestureDemo.zipzip GestureDemo.zip manage 30.2 K 29 Mar 2011 - 16:52 SvenKratz GestureDemo, LMU Edition
Topic revision: r1 - 29 Mar 2011, SvenKratz
 
This site is powered by FoswikiCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding Medieninformatik-Wiki? Send feedback