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:
- della vista
onTouchEvent
- Il
OnGestureListener's onDown
- Il
OnGestureListener's onShowPress
- 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);
}
}
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
@javito non puoi pubblicare il codice corretto come risposta, per favore - una specie di caso complicato che non è ben documentato – Elemental
@javito +1 sulla tua domanda per aver capito questo. Mi ha aiutato a rubare eventi anche dalla mia vista pergamena –