2012-04-04 19 views
4

Ich versuche, eine Wischgeste in meiner App zu implementieren. Ich habe fast den ganzen Code gemacht, aber es funktioniert nicht. HierAndroid - Probleme mit Wischgeste

ist der Code, den ich in meiner Tätigkeit haben:

// Swipe detector 
gestureDetector = new GestureDetector(new SwipeGesture(this)); 
gestureListener = new OnTouchListener() { 
    public boolean onTouch(View v, MotionEvent event) 
    { 
     Log.e("", "It works"); 
     return gestureDetector.onTouchEvent(event); 
    } 
}; 

LinearLayout root = (LinearLayout) findViewById(R.id.rules_root); 
root.setOnTouchListener(gestureListener); 

Wenn ich den Bildschirm berühren, die logcat zeigt it works.

Hier ist er meint den Code der Klasse SwipeGesture:

public class SwipeGesture extends SimpleOnGestureListener 
{ 
    private static final int SWIPE_MIN_DISTANCE = 120; 
    private static final int SWIPE_MAX_OFF_PATH = 250; 
    private static final int SWIPE_THRESHOLD_VELOCITY = 200; 

    private Activity activity; 

    public SwipeGesture(Activity activity) 
    { 
     super(); 
     this.activity = activity; 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) 
    { 
     Log.e("", "Here I am"); 
     try 
     { 
      if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) return false; 
      if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) 
      { 
       if (((TabActivity) activity.getParent()).getTabHost() != null) 
       { 
        TabHost th = ((TabActivity) activity.getParent()).getTabHost(); 
        th.setCurrentTab(th.getCurrentTab() - 1); 
       } 
       else 
       { 
        activity.finish(); 
       } 
       Log.e("", "Swipe left"); 
      } 
      else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) 
      { 
       if (((TabActivity) activity.getParent()).getTabHost() != null) 
       { 
        TabHost th = ((TabActivity) activity.getParent()).getTabHost(); 
        th.setCurrentTab(th.getCurrentTab() + 1); 
       } 
       Log.e("", "Swipe right"); 
      } 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     return false; 
    } 
} 

Die Linie Log.e("", "Here I am"); nie angezeigt wird. Also nehme ich an, dass die onFling-Methode nie aufgerufen wird.

Irgendwelche Ideen, warum das nicht funktioniert?

Danke.

Grüße.

V.

Antwort

6

Deaktivieren Sie in Ihrem SimpleOnGestureListener onDown, damit Ihre Gesten registriert werden. Es kann nur true zurück, aber es muss wie folgt definiert werden ..

@Override 
    public boolean onDown(MotionEvent e) { 
      return true; 
    } 

.... See this link.. and the comment below the answer..

+0

Dank, das funktioniert! – Manitoba

+0

Ohhh Mann, ich war fast zwei Stunden mit dem gleichen Problem, +1 danke für die Objektivität –

5

Sie benötigen, ist ein Beispiel hier ein paar Dinge zu ändern.

Stellen Sie Ihren OnTouchListener:

root.setOnTouchListener(new View.OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent event) { 
       if (gestureDetector.onTouchEvent(event)) { 
        return false; 
       } 
       return false; 
      } 
     }); 

SwipeGesture Klasse:

class SwipeGesture extends SimpleOnGestureListener { 
    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
      float velocityY) { 

     try { 
      if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
       return false; 
      if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE 
        && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
//Do something 

       return true; 
      } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE 
        && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
//Do something 
       return true; 

      } 

     } catch (Exception e) { 
      Log.e("Fling", "There was an error processing the Fling event:" 
        + e.getMessage()); 
     } 
     return true; 
    } 

    // Necessary for the onFling event to register 
    @Override 
    public boolean onDown(MotionEvent e) { 
     return true; 
    } 
} 

Es sieht aus wie Sie zwischen Tabs klauen sind. Mit und ViewPager ist viel einfacher und reibungsloser für Ihre Benutzer.