2011-03-15 4 views
10

Je veux détecter un mouvement de flip dans un bloc de l'écran. J'utilise le code suivant pour cela.Android OnGestureListener Fling ne détecte pas

public class MyinfoActivity extends Activity implements OnGestureListener { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     .......... 
     .......... 
     gestureScanner = new GestureDetector(this); 
     resBlock = (TableRow) findViewById(R.id.ResBlock); 
     gestureScanner = new GestureDetector(this); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent me){ 
     Log.d(null,"Touch"); 
     if (gestureScanner.onTouchEvent(me)) 
      return gestureScanner.onTouchEvent(me); 
     else 
      return false; 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, 
         float velocityX, float velocityY) { 
     Log.d(null,"Fling"); 
     ............ 
     ............ 
    } 

    @Override 
    public boolean onDown(MotionEvent arg0) { 
     return false; 
    } 

    @Override 
    public void onLongPress(MotionEvent e) {} 

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, 
         float distanceX, float distanceY) { 
     return false; 
    } 

    @Override 
    public void onShowPress(MotionEvent e) {} 

    @Override 
    public boolean onSingleTapUp(MotionEvent e) { 
     return false; 
    } 
} 

Il détecte le TouchEvent, mais il ne détecte aucun mouvement de déclenchement. Quel est le problème dans mon code?

Répondre

14

J'utilise les éléments suivants code et résolu le problème.

public class MyinfoActivity extends Activity { 
    private GestureDetector gestureScanner; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.myinfotrackerinner); 
     gestureScanner = new GestureDetector(this,simpleOnGestureListener); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     return gestureScanner.onTouchEvent(event); 
    } 

    GestureDetector.SimpleOnGestureListener simpleOnGestureListener = 
         new GestureDetector.SimpleOnGestureListener() { 
     @Override 
     public boolean onDown(MotionEvent event) { 
      return true; 
     } 

     @Override 
     public boolean onFling(MotionEvent event1, MotionEvent event2, 
            float velocityX, float velocityY) { 
      Log.d(null,"Fling"); 
      int dx = (int) (event2.getX() - event1.getX()); 
      // don't accept the fling if it's too short 
      // as it may conflict with a button push 
      if (Math.abs(dx) > MAJOR_MOVE 
         && Math.abs(velocityX) > Math.abs(velocityY)) { 
       if (velocityX > 0) { 
        moveGraph("L"); 
       } else { 
        moveGraph("R"); 
       } 
       return true; 
      } else { 
       return false; 
      } 
     } 
    }; 
} 
+8

Merci. Ce message m'a beaucoup aidé. La clé ici est de retourner 'true' dans la méthode' onDown (MotionEvent) '! – garbagecollector

+1

et quelle valeur aurait MAJOR_MOVE? ;) –

3

Votre méthode onTouchEvent est d'abord incorrecte et provoque l'appel de onTouchEvent par l'objet gestureScanner. Vous devez changer par ceci:

@Override 
    public boolean onTouchEvent(MotionEvent me){ 
     Log.d(null,"Touch"); 
     if (gestureScanner.onTouchEvent(me)) 
      return true; 
     else 
      return super.onTouchEvent(event); // or false (it's what you whant). 
    } 

Vous avez également cette ligne deux fois:

gestureScanner = new GestureDetector(this); 

Ensuite, essayez de changer votre méthode de onFling comme ceci:

@Override 
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) { 
    try{ 
     if(Math.abs(e1.getY()-e2.getY()) > 250) 
      return false;    
     if(e1.getX() - e2.getX() > 120 && Math.abs(velocityX) > 200){ 
      Log.d("Fling", "Move Next"); 
      //do something... 
     } 
     else if(e2.getX() - e1.getX() > 120 && Math.abs(velocityX) > 200){ 
      Log.d("Fling", "Move Previous"); 
      //do something... 
     } 
     return false; 
    } 
    catch(Exception e){ 
     return false; 
    } 
} 
+0

J'ai essayé en changeant le code de onTouchEvent selon la direction et aussi la méthode de onFling. Mais pas de changement dans le résultat. Il détecte toujours l'événement tactile, mais pas l'événement onFling. –

3

retour true dans votre méthode onDown

@Override 
public boolean onDown(MotionEvent arg0) { 
    return true; 
} 
Questions connexes