2009-12-15 18 views
11

Nel mio app che cercano di catturare un evento un'avventura su una vista (un ScrollView per essere esatti, ma hanno provato con LinearLayout pure).Android: rilevare gesti fling

Impostando i punti di interruzione, è possibile vedere che MotionEvents si verifica correttamente fino al punto in cui deve essere attivato onFling().

Il flusso di eventi è la seguente:

  1. della vista onTouchEvent
  2. Il OnGestureListener's onDown
  3. Il OnGestureListener's onShowPress
  4. Il OnGestureListener's onLongPress

sono in perdita su come continua cercando di eseguire il debug di una cosa del genere e la ricerca di Google non gira molto. Qualche indicazione?

Ho anche allegare la relativa vista che dovrebbe gestire i gesti:

import android.content.Context; 
import android.content.Intent; 
import android.view.GestureDetector; 
import android.view.MotionEvent; 
import android.widget.ScrollView; 

public class GestureScrollView extends ScrollView { 
    private static int MAJOR_MOVE = 60; 
    private GestureDetector gd; 

    public GestureScrollView(final Context context) { 
     super(context); 
     gd = new GestureDetector(context, 
       new GestureDetector.OnGestureListener() { 

        @Override 
        public boolean onSingleTapUp(MotionEvent e) { 
         // TODO Auto-generated method stub 
         return false; 
        } 

        @Override 
        public void onShowPress(MotionEvent e) { 
         // TODO Auto-generated method stub 

        } 

        @Override 
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, 
          float distanceY) { 
         // TODO Auto-generated method stub 
         return false; 
        } 

        @Override 
        public void onLongPress(MotionEvent e) { 
         // TODO Auto-generated method stub 

        } 

        @Override 
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
          float velocityY) { 
         int dx = (int) (e2.getX() - e1.getX()); 
         if (Math.abs(dx) > MAJOR_MOVE 
           && Math.abs(velocityX) > Math.abs(velocityY)) { 
          if (velocityX < 0) { 
           Intent intent = new Intent(context, Main.class); 
           context.startActivity(intent); 
          } 
         } 
         return false; 
        } 

        @Override 
        public boolean onDown(MotionEvent e) { 
         // TODO Auto-generated method stub 
         return false; 
        } 
       }); 
    } 

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

risposta

2

Prendere la MotionEvent da attività non dal View. Quando il tuo rilevatore di gesti è basato su MotionEvent che proviene da Activity, otterrai l'evento onFling. Quindi devi spostarti su TouchEvent() da GestureScrollView alla tua classe di attività. Saluti!

+2

Grazie per aver trovato il tempo di rispondere. In realtà era qualcosa di molto più complicato di così. Il meccanismo di bubbling di Android's Event è un po 'strano. Che ha risolto il problema per me è stato sempre onTouchEvent() per tornare sempre vero in questo modo: @Override pubblico onTouchEvent booleana (evento MotionEvent) { gd.onTouchEvent (evento); return true; } E aggiungere un metodo in più: @Override pubblico onInterceptTouchEvent booleana (MotionEvent ev) { \t ritorno gd.onTouchEvent (ev); } Saluti. – javito

+0

@javito non puoi pubblicare il codice corretto come risposta, per favore - una specie di caso complicato che non è ben documentato – Elemental

+0

@javito +1 sulla tua domanda per aver capito questo. Mi ha aiutato a rubare eventi anche dalla mia vista pergamena –

Problemi correlati