2012-11-15 3 views
9

Comme je l'ai mentionné sur le titre, l'application a un ScrollView et un GestureDetector aussi. En dehors des événements tactiles de ScrollView, GestureDetector gère les actions de balayage de gauche à droite et de droite à gauche. Ils fonctionnent tous bien.Utilisation de GestureLibrary avec ScrollView

Maintenant, je veux ajouter un GestureLibrary -I signifie brut- à l'activité. J'ai regardé différentes sources et en quelque sorte ajouté correctement. Simplement, la mise en page qui ressemble à ceci:

<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> 

Il dessine comme je le voulais (la ligne jaune), mais il ne déclenche pas des méthodes. Voici comment je OnGesturePerformedListener mis en œuvre:

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

Et voici 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"); 
      } 
     } 
    } 
}; 

C'est tout. Par le mur, j'ai essayé ce code source avec une activité différente qui n'a pas de ScrollView et fonctionne bien.

Enfin, je ne suis pas sûr est-il GestureDetector, de sorte que l'application est ainsi à l'aide du détecteur:

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

Et mon 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; 
    } 
} 

Quel est le problème avec mon approche?

Répondre

8

Tous les événements tactiles dans android vont des enfants aux parents. Ainsi, la vue déroulante gère tous les événements tactiles, et votre détecteur de mouvement ne les reçoit pas. Vous pouvez régler auditeur contact sur ScrollView:

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

Vous devez vérifier que défilement fonctionne selon les besoins, et vous ne les événements de défilement ne sont pas consommés.

+0

Qu'est-ce que ce "détecteur"? est-ce un objet SwipeDetector? –

+0

@RahulHawge, le "détecteur" est l'objet GestureDetector. – strizzwald