2013-11-01 12 views
8

Ich folge Detecting common gestures Guide. Ich habe android-support-v4.jar Bibliothek verknüpft GestureDetectorCompat zu bekommen, und mein Code scheint genau die gleichen wie in der Führung, außer ich bin Gesten in meiner benutzerdefinierten Ansicht, anstatt in der Aktivität Nachweis:GestureDetector.SimpleOnGestureListener und GestureDetectorCompat funktionieren nicht. Was ist falsch an meinem Code?

public class MyGlView extends GLSurfaceView { 

    private GestureDetectorCompat m_gestureDetector = null; 

    public MyGlView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(context); 
    } 
    public MyGlView(Context context) { 
     super(context); 
     init(context); 
    } 
    private void init(Context context) { 
     if (m_gestureDetector == null) 
      m_gestureDetector = new GestureDetectorCompat(context, new MyGestureListener()); 

     setEGLContextClientVersion(2); 
     setRenderer(new DrawSurfRenderer()); 
     setRenderMode(RENDERMODE_CONTINUOUSLY); 
    } 

@Override 
    public boolean onTouchEvent(MotionEvent event) { 

     m_gestureDetector.onTouchEvent(event);  
     return super.onTouchEvent(event); 
    } 

public class MyGestureListener extends GestureDetector.SimpleOnGestureListener { 

     @Override 
     public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) 
     { 
      Log.e("", "OnScroll: deltaX=" + String.valueOf(e2.getX() - e1.getX()) + ", deltaY=" + String.valueOf(e2.getY() - e1.getY())); 
      return true; 
     } 

     @Override 
     public boolean onSingleTapUp(MotionEvent e) 
     { 
      Log.e("", "onSingleTapUp: X=" + String.valueOf(e.getX()) + ", Y=" + String.valueOf(e.getY())); 
      return true; 
     } 

     @Override 
     public void onLongPress(MotionEvent e) 
     { 
      Log.e("", "onLongPress: X=" + String.valueOf(e.getX()) + ", Y=" + String.valueOf(e.getY())); 
     } 
    } 

Egal was ich tue, mit der Touchscreen, ich bekomme nur onLongPress. In der Tat, wenn ich schnell tippe (schnell das Berühren und Loslassen des Bildschirms) bekomme ich immer noch onLongPress etwas nachdem ich meinen Finger vom Bildschirm entferne (vermutlich ist das eine lange Antipper-Verzögerung).

Was ist der Haken?

+0

haben Sie versucht, 'return super.onTouchEvent (event);' zu 'false;'? Und versuchen Sie Ihre Aktionen in der Simple View (wie zB WebView). –

+0

@ R.id.pandacoder: 'return false;' ändert nichts. –

+1

Nach einigen Nachforschungen denke ich, dass Sie versuchen können, die 'onDown'-Methode hinzuzufügen, die zu Ihrer' onTouchEvent'-Methode zurückkehrt. –

Antwort

18

Ich zitiere Android Guide on Detecting Common Gestures:

Ob Sie GestureDetector.OnGestureListener verwenden, ist es am besten Praxis ist eine onDown() -Methode zu implementieren, die true zurückgibt. Dies liegt daran, dass alle Gesten mit einer onDown() - Nachricht beginnen. Wenn Sie false von onDown() zurückgeben, wie es GestureDetector.SimpleOnGestureListener standardmäßig tut, nimmt das System an, dass Sie den Rest der Geste ignorieren möchten, und die anderen Methoden von GestureDetector.OnGestureListener werden nie aufgerufen. Dies kann unerwartete Probleme in Ihrer App verursachen. Das einzige Mal, dass Sie false von onDown() zurückgeben sollten, ist, wenn Sie wirklich eine ganze Geste ignorieren möchten.

Die Tatsache, dass Sie die onDown() Methode nicht implementiert haben, verursachte Nebenwirkungen.

+0

Seltsamerweise hatte ich das gleiche Problem wie das OP, außer dass meine onLongPress-Methode gerade gut hieß, trotz der Tatsache, dass sie nicht auf "down" zurückgekommen sind – AgentKnopf