2013-11-01 22 views
8

Tôi đang theo dõi Detecting common gestures hướng dẫn. Tôi đã gắn liền với android-support-v4.jar thư viện để có được GestureDetectorCompat, và mã của tôi dường như giống hệt nhau như trong hướng dẫn, ngoại trừ tôi phát hiện cử chỉ trong giao diện tùy chỉnh của tôi chứ không phải là các hoạt động:GestureDetector.SimpleOnGestureListener và GestureDetectorCompat không hoạt động. Có gì sai với mã của tôi?

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

Không có vấn đề gì tôi làm với màn hình cảm ứng, tôi chỉ nhận được onLongPress. Trong thực tế, khi tôi nhấn nhanh (nhanh chóng chạm và thả màn hình), tôi vẫn nhận được onLongPress một chút sau khi tôi tháo ngón tay ra khỏi màn hình (nghi ngờ đó là độ trễ phát hiện chạm lâu).

Bắt là gì?

+0

bạn đã cố thay đổi 'return super.onTouchEvent (event);' to 'return false;'? Và thử hành động của bạn trên Chế độ xem đơn giản (ví dụ như WebView chẳng hạn). –

+0

@ R.id.pandacoder: 'return false;' không thay đổi gì cả. –

+1

Sau khi điều tra, tôi nghĩ bạn có thể thử thêm phương thức 'onDown' trả về true cho phương thức' onTouchEvent' của bạn. –

Trả lời

18

tôi trích dẫn Android Guide on Detecting Common Gestures:

hay không bạn sử dụng GestureDetector.OnGestureListener, đó là thực hành tốt nhất để thực hiện một phương pháp onDown() mà trả về true. Điều này là do tất cả các cử chỉ bắt đầu bằng một thông báo onDown(). Nếu bạn trả về false từ onDown(), như GestureDetector.SimpleOnGestureListener làm theo mặc định, hệ thống giả định rằng bạn muốn bỏ qua phần còn lại của cử chỉ, và các phương thức khác của GestureDetector.OnGestureListener không bao giờ được gọi. Điều này có khả năng gây ra các sự cố không mong muốn trong ứng dụng của bạn. Thời gian duy nhất bạn nên trả về false từ onDown() là nếu bạn thực sự muốn bỏ qua toàn bộ cử chỉ.

Thực tế là bạn không triển khai phương pháp onDown() đã gây ra tác dụng phụ.

+0

Lạ lùng, tôi có cùng vấn đề với OP, ngoại trừ phương thức onLongPress của tôi được gọi là tốt, mặc dù không có onDown trả về true – AgentKnopf

Các vấn đề liên quan