2016-08-05 16 views
6

Ich verwende die Gesten-API mit einer Gestenbibliothek, die ich erstellt habe, und sie funktioniert wirklich gut. Das Problem besteht darin, dass die Geste nach dem Beenden von OnGesturePerformedListener auf dem Bildschirm sichtbar sein soll. Stattdessen wird die Geste gelöscht. Ich dachte, dass vielleicht ein Ereignis nach OnGesturePerformedListener ist - ich konnte die Geste in OnGesturePerformedListener speichern und dann in diesem späteren Ereignis wieder anzeigen. Wer weiß, ob es ein solches Ereignis gibt? Hier ist der Code:Android SDK - Verwenden der Gesten-API, möchte die Gesten auf dem Bildschirm bleiben, nachdem sie erkannt wurden

private OnGesturePerformedListener handleGestureListener = new OnGesturePerformedListener() { 
     @Override 
     public void onGesturePerformed(GestureOverlayView gestureView, 
             Gesture gesture) { 
      if (gesture.getStrokesCount() != 2){ 
       setWonderEmoticon(); 
       return; 
      } 
      ArrayList<Prediction> predictions = gLib.recognize(gesture); 
      // one prediction needed 
      if (predictions.size() > 0) { 
       Prediction prediction = predictions.get(0); 
       // checking prediction 
       if (prediction.score > 20.0) { 
        setHappyEmoticon(); 
       } 
       else { 
        setWonderEmoticon(); 
       } 
      } 
     } 
    }; 

By the way, das gleiche passiert, wenn setWonderEmoticon() und setHappyEmoticon() aus dem Code entfernt werden.

Antwort

1

Hier ist ein Beispiel, das mit dem OnGesturePerformedListener gut funktioniert:

MainActivity.java:

// ... 

public class MainActivity extends AppCompatActivity implements GestureOverlayView.OnGesturePerformedListener, GestureOverlayView.OnGestureListener { 

    GestureOverlayView mGestureView; 
    ImageView mImageView; 
    TextView mText; 
    Paint mPaint; 
    Bitmap mBitmap; 
    Canvas mCanvas; 
    GestureLibrary mGestureLib; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mImageView = (ImageView) findViewById(R.id.image_view); 
     mGestureView = (GestureOverlayView) findViewById(R.id.gesture_overlay); 
     mGestureView.addOnGesturePerformedListener(this); 
     mGestureView.addOnGestureListener(this); 

     mGestureView.setGestureColor(Color.BLACK); 
     mGestureView.setUncertainGestureColor(Color.BLACK); 
     mGestureView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
      @TargetApi(Build.VERSION_CODES.JELLY_BEAN) 
      @Override 
      public void onGlobalLayout() { 
       mGestureView.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
       mBitmap = Bitmap.createBitmap(mGestureView.getWidth(), mGestureView.getHeight(), Bitmap.Config.ARGB_8888); 
       mCanvas = new Canvas(mBitmap); 
      } 
     }); 

     mPaint = new Paint(); 
     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setStrokeWidth(12.0f); 
     mPaint.setColor(Color.GRAY); 

     mText = (TextView) findViewById(R.id.text); 

     mGestureLib = GestureLibraries.fromRawResource(getApplicationContext(), R.raw.gesture); 
     mGestureLib.load(); 
    } 

    @Override 
    public void onGesturePerformed(GestureOverlayView gestureOverlayView, Gesture gesture) { 
     if (gesture.getStrokesCount() > 0) { 
      ArrayList<Prediction> predictions = mGestureLib.recognize(gesture); 
      for (GestureStroke stroke : gesture.getStrokes()) { 
       Path path = stroke.getPath(); 
       mCanvas.drawPath(path, mPaint); 
      } 
      mImageView.setImageBitmap(mBitmap); 
      if (!predictions.isEmpty()) { 
       Prediction best = predictions.get(0); 
       mText.setText(String.format("Gesture: %s", best.name)); 
      } 
     } 
    } 

    // ... 
} 

activity_main.xml (snapshot):

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="onl.nok.gestures.MainActivity"> 

    <TextView 
     android:id="@+id/text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Waiting ..." 
     android:textSize="25sp" /> 

    <ImageView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/image_view" /> 

    <android.gesture.GestureOverlayView 
     android:id="@+id/gesture_overlay" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:gestureStrokeType="single" 
     android:fadeEnabled="false" /> 
</RelativeLayout> 

Wie neues gest. anwenden Ure?

  1. Track-Gesten mit dem Android-App Gesture Builder
  2. erstellen Ressourcenordner raw in Ihrem Projekt: <Project>/app/src/main/res/raw/
  3. Kopieren Sie die generierte Datei gesture.txt von Ihrem Gerät: /Android/data/pack.GestureApp/files/gesture.txt
  4. Und es schließlich Einfügen der erzeugte Ordner raw: <Project>/app/src/main/res/raw/gesture.txt

Schließlich schob ich den Quellcode zu GitHub: https://github.com/nok/android-gesture-libraries


2. bearbeiten:

Du hast Recht. So verwende ich eine einfache ImageView, um die ausgeführten Gesten zu zeichnen. Außerdem können Sie den Stil in mPaint vom Typ Paint ändern. Sie können alle Änderungen in den Push-Commits 82eabfb und 5ce427d auf GitHub finden.

+0

Dies funktioniert genau so, wie mein Code tut - kein Mehrwert. Die Geste verschwindet vom Bildschirm, aber ich möchte, dass sie auf dem Bildschirm bleibt. – scrayne

+0

Ich hoffe, dass es ein anderes Ereignis gibt, das auftritt, wenn die Geste ausgeführt wird, aber bevor sie verschwindet. – scrayne

+0

Okay, ich habe meine Antwort bearbeitet, vielleicht können die Änderungen Ihre Frage beantworten. –