2009-12-15 9 views
11

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:

  1. Widok na onTouchEvent
  2. OnGestureListener's onDown
  3. OnGestureListener's onShowPress
  4. 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); 
    } 
} 

Odpowiedz

2

Połykają MotionEvent z działalności nie od widoku. Kiedy twój wykrywacz gestów jest oparty na MotionEvent, który pochodzi z działania, otrzymasz zdarzenie onFling. Musisz przenieść się na TouchEvent() z GestureScrollView do swojej klasy Activity. Pozdrawiam!

+2

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

+0

@javito nie możesz wysłać prawidłowego kodu jako odpowiedzi proszę - rodzaj trudnego przypadku, który nie jest dobrze udokumentowany – Elemental

+0

@javito +1 na twoje pytanie do wymyślenia tego. Pomogło mi to również ukraść wydarzenia z mojego widoku przewijania –