W mojej aplikacji staram się uchwycić zdarzenia fling na widoku (ScrollView
, aby być dokładnym, ale próbowałem z LinearLayout
, jak również).Android: wykrywanie fling gesty
Ustawiając punkty przerwania, widzę, że MotionEvents
działa poprawnie, do momentu, w którym powinien wystrzelić onFling()
.
Strumień zdarzenia jest następujący:
- Widok na
onTouchEvent
OnGestureListener's onDown
OnGestureListener's onShowPress
OnGestureListener's onLongPress
jestem ze stratą na jak kontynuuj próbowanie debugowania czegoś takiego, a wyszukiwarka Google się nie włącza dużo. Jakieś wskazówki?
ja również dołączyć odpowiedni widok, który powinien obsługiwać gesty:
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);
}
}
Dzięki za poświęcenie czasu na odpowiedź. W rzeczywistości było to o wiele bardziej skomplikowane. Mechanizm propagacji zdarzeń Androida jest nieco dziwny. Co rozwiązać go dla mnie było coraz onTouchEvent() zawsze zwraca wartość true tak: @Override public boolean onTouchEvent (event MotionEvent) { gd.onTouchEvent (event); return true; } I dodać dodatkową metodę: @Override public boolean onInterceptTouchEvent (MotionEvent ev) { \t powrót gd.onTouchEvent (EV); } Pozdrawiam. – javito
@javito nie możesz wysłać prawidłowego kodu jako odpowiedzi proszę - rodzaj trudnego przypadku, który nie jest dobrze udokumentowany – Elemental
@javito +1 na twoje pytanie do wymyślenia tego. Pomogło mi to również ukraść wydarzenia z mojego widoku przewijania –