2012-11-15 9 views
9

Wie ich im Titel erwähnt, hat App auch eine ScrollView und eine GestureDetector. Außerhalb von ScrollViews Berührungsereignissen behandelt der GestureDetector Swipe-Aktionen wie von links nach rechts und von rechts nach links. Sie arbeiten alle gut.Verwendung von GestureLibrary mit ScrollView

Jetzt möchte ich eine GestureLibrary -I bedeuten roh- zu Aktivität hinzufügen. Ich habe verschiedene Quellen gesucht und irgendwie richtig hinzugefügt. Einfach suchen Layout wie folgt aus:

<android.gesture.GestureOverlayView 
    android:id="@+id/gOverlay" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <ScrollView 
     android:id="@+id/content_scroll" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:scrollbars="none"> 

      </ScrollView> 
      <!-- Other views --> 
</android.gesture.GestureOverlayView> 

Es zeichnen, wie ich (die gelbe Linie) wollte, aber es auslösenden keine Methoden. Hier ist, wie ich implementiert OnGesturePerformedListener:

/* 
    * Gestures 
    */ 
    gLibrary = GestureLibraries.fromRawResource(this, R.raw.gestures); 
    if (!gLibrary.load()) { finish(); } 
    GestureOverlayView gestureOverlayView = (GestureOverlayView) findViewById(R.id.gOverlay); 
    gestureOverlayView.addOnGesturePerformedListener(gestureListener); 

Und hier ist gestureListener:

private OnGesturePerformedListener gestureListener = new OnGesturePerformedListener() { 
    public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) { 
     ArrayList<Prediction> predictions = gLibrary.recognize(gesture);    
     if (predictions.size() > 1) { 
      for(Prediction prediction: predictions){ 
       Log.d("Test", "Looking for gestures"); 
      } 
     } 
    } 
}; 

Das ist alles. An der Wand habe ich diesen Quellcode mit verschiedenen Activity ausprobiert, der keine ScrollView hat und gut funktioniert.

Schließlich, ich bin nicht sicher, dass es über GestureDetector, so das ist, wie App-Detektor:

public boolean dispatchTouchEvent(MotionEvent ev) { 
    if (detector != null) { 
     if (detector.onTouchEvent(ev)) { 
      return true; 
     } 
    } 
    return super.dispatchTouchEvent(ev); 
} 

Und mein SwipeDetector:

private class SwipeDetector extends SimpleOnGestureListener { 
    private static final int SWIPE_MIN_DISTANCE = 120; 
    private static final int SWIPE_MAX_OFF_PATH = 250; 
    private static final int SWIPE_THRESHOLD_VELOCITY = 200; 
    public boolean onFling(android.view.MotionEvent e1, android.view.MotionEvent e2, float velocityX, float velocityY) { 
     if(Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) { return false; } 
     if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { return false; } 
     if(e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { filterButton.performClick();return true; }   
     return false; 
    } 
} 

Was mit meinem Ansatz falsch?

Antwort

8

Alle Touch-Ereignisse in Android geht von Kindern zu den Eltern. In der Scroll-Ansicht werden alle Berührungsereignisse behandelt, und der Gestendetektor empfängt sie nicht. Sie können Touch-Hörer auf ScrollView gesetzt:

scrollView.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (detector != null) { 
       return detector.onTouchEvent(event); 
      return false; 
     } 
    }); 

Sie haben die Schriftrolle zu überprüfen, wie erforderlich funktioniert, und Sie nicht blättern Ereignisse verbraucht.

+0

Was ist das "Detektor"? ist es SwipeDetector Objekt? –

+0

@RahulHawge, der "Detektor" ist das GestureDetector-Objekt. – strizzwald

Verwandte Themen