2011-03-15 22 views
10

Quiero detectar fling motion en un bloque de la pantalla. Estoy usando el siguiente código para eso.Android OnGestureListener Fling no detecta

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

está detectando la TouchEvent, pero no detecta ningún movimiento aventura. ¿Cuál es el problema en mi código?

Respuesta

14

que utilizó la siguiente código y resolvió el problema.

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

Gracias. Esta publicación me ayudó mucho. La clave aquí es devolver 'true' en el método' onDown (MotionEvent) '! – garbagecollector

+1

y qué valor tendría MAJOR_MOVE? ;) –

3

Primero su método onTouchEvent es incorrecto y provocará 2 llamadas de onTouchEvent por el objeto gestureScanner. necesita cambiar por esto:

@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). 
    } 

También tienen esta línea dos veces:

gestureScanner = new GestureDetector(this); 

luego tratar de cambiar su método onFling así:

@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

He tratado de cambiar el código de onTouchEvent según la dirección y también el método onFling. Pero no hay cambio en el resultado. Todavía está detectando el evento táctil, pero no en el evento Fusión. –

3

retorno true en su método onDown

@Override 
public boolean onDown(MotionEvent arg0) { 
    return true; 
} 
Cuestiones relacionadas