2011-05-12 7 views
2

Je suis mise en œuvre d'un détecteur de onFling semblable à la question suivante: Fling gesture detection on grid layoutTrouble with onFling et SimpleOnGestureListener

Cependant, je ne peux pas le faire fonctionner. (? Peut-être le AsyncTask)

En cas d'une certaine façon, je l'ai mis en place mon application est à l'origine de cette question, voici comment mon application est structuré:

(J'ai essayé de faire une liste bien formaté, mais vissé le code ci-dessous pour une raison quelconque?)

--MapActivity crée un MapView. --MapView crée une ASyncTask pour extraire XML à partir d'une URL.

--onPostExecute() de la AsyncTask analyse le XML et ajoute un ItemizedOverlay en utilisant les données extraites

--onTap() fonction de la ItemizedOverlay récupère une image à partir de la bande en utilisant LoaderImageView (http://www.anddev.org/novice-tutorials-f8/imageview-with-loading-spinner-t49439.html)

fonction --onTap() appelle ensuite le spectacle() de la classe PopupPanel ci-dessous

Comme vous pouvez le voir dans le code ci-dessous, les lignes commentées fonctionnent. Cependant, les événements onTouch et onFling ne sont jamais touchés lorsqu'ils sont utilisés avec la classe MyGestureDetector.

class PopupPanel { 
    View popup; 
    boolean isVisible = false; 
    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; 
    private GestureDetector gestureDetector; 
    public View.OnTouchListener gestureListener; 

    PopupPanel(Context context, int layout) { 
     ViewGroup parent = (ViewGroup) map.getParent(); 

     popup = ((MapActivity) context).getLayoutInflater().inflate(layout, parent, false); 

     SelectFilterActivity selectFilterActivity = new SelectFilterActivity(); 
     popup.setOnClickListener(selectFilterActivity); 

// This works! 
//   popup.setOnTouchListener(new View.OnTouchListener() { 
//    public boolean onTouch(View v, MotionEvent event) { 
//     Toast.makeText(map.getContext(), "Touched", Toast.LENGTH_SHORT).show(); 
//     return false; 
//    } 
//   }); 

     // Gesture detection 
     gestureDetector = new GestureDetector(new MyGestureDetector()); 
     gestureListener = new View.OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent event) { 
       if (gestureDetector.onTouchEvent(event)) { 
        return true; 
       } 
       return false; 
      } 
     }; 
    } 

    class MyGestureDetector extends SimpleOnGestureListener { 
     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
      try { 
       if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
        return false; 
       // right to left swipe 
       if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
        Toast.makeText(map.getContext(), "Left Swipe", Toast.LENGTH_SHORT).show(); 
       } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
        Toast.makeText(map.getContext(), "Right Swipe", Toast.LENGTH_SHORT).show(); 
       } 
      } catch (Exception e) { 
       // nothing 
      } 
      return false; 
     } 

     @Override 
     public boolean onDown(MotionEvent e) { 
      return true; 
     } 
    } 

    View getView() { 
     return (popup); 
    } 

    void show(boolean alignTop) { 
     RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
       RelativeLayout.LayoutParams.WRAP_CONTENT, 
       RelativeLayout.LayoutParams.WRAP_CONTENT); 

     if (alignTop) { 
      lp.addRule(RelativeLayout.ALIGN_PARENT_TOP); 
      lp.setMargins(0, 20, 0, 0); 
     } else { 
      lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 
      lp.setMargins(0, 0, 0, 60); 
     } 

     hide(); 

     ((ViewGroup) map.getParent()).addView(popup, lp); 
     isVisible = true; 
    } 

    void hide() { 
     if (isVisible) { 
      isVisible = false; 
      ((ViewGroup) popup.getParent()).removeView(popup); 
     } 
    } 
} 

Répondre

1

Je ne suis pas 100% sûr que ce soit la raison, mais je n'ai pas vu appeler à View.setOnTouchListener dans votre code pour gestureListener. J'aurais attendu la ligne;

setOnTouchListener(gestureListener) 

Après l'avoir créé.

+0

En fait j'essayais d'implémenter ceci dans une classe dans un fichier différent. Cela ne fonctionnait pas pour une raison quelconque, donc je l'ai déplacé dans le même fichier que le popup. Vous avez oublié d'ajouter 'popup.setOnTouchListener (gestureListener);' à la fin du constructeur. Maintenant, je l'ai fait et tout fonctionne bien. Merci. Je l'attribue à mon besoin d'aller au lit. =) –

8

Essayez de renvoyer true à partir de votre MyGestureDetector.onDown. L'implémentation de la superclasse doit renvoyer false qui supprime ensuite la remise des événements futurs jusqu'à ce que le contact soit relâché.