2013-11-01 59 views
8

我正在關注Detecting common gestures指南。我已經掛android-support-v4.jar庫得到GestureDetectorCompat,和我的代碼看起來完全一樣,在指南中,除了我檢測我的自定義視圖的手勢,而不是活動:GestureDetector.SimpleOnGestureListener和GestureDetectorCompat不起作用。我的代碼有什麼問題?

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())); 
     } 
    } 

不管我做什麼用觸摸屏,我只得到onLongPress。事實上,當我快速點擊(快速觸摸並釋放屏幕)時,我從屏幕上移開手指(懷疑是長時間點擊檢測延遲)後,仍然略微得到onLongPress

有什麼收穫?

+0

你嘗試改變'返回super.onTouchEvent(event);'返回false;'?並嘗試你的簡單視圖(如WebView的例子)的行動。 – 2013-11-01 14:48:10

+0

@ R.id.pandacoder:'return false;'不會改變任何東西。 –

+1

經過一番調查,我認爲你可以嘗試添加'onDown'方法,它返回true到你的'onTouchEvent'方法。 – 2013-11-01 15:09:38

回答

18

我引述​​:

無論你是否使用GestureDetector.OnGestureListener,它的實現返回true的onDown()方法的最佳實踐。這是因爲所有手勢都以onDown()消息開始。如果您從onDown()返回false,則默認情況下,由於GestureDetector.SimpleOnGestureListener會執行此操作,因此係統會假定您要忽略手勢的其餘部分,並且GestureDetector.OnGestureListener的其他方法始終不會被調用。這可能會導致您的應用程序出現意外問題。你應該從onDown()返回false的唯一時間是如果你真的想忽略整個手勢。

事實上,你沒有實施onDown()方法造成的副作用。

+0

奇怪的是,我和OP有同樣的問題,只是我的onLongPress方法被調用的很好,儘管沒有onDown返回true – AgentKnopf