GestureDetector.SimpleOnGestureListener和GestureDetectorCompat不起作用。我的代码出了什么问题?

时间:2013-11-01 14:41:57

标签: android gesture-recognition gestures

我正在关注Detecting common gestures指南。我已链接到android-support-v4.jar库以获取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(怀疑是长时间检测延迟)。

有什么问题?

1 个答案:

答案 0 :(得分:19)

我引用Android Guide on Detecting Common Gestures

  

是否使用GestureDetector.OnGestureListener,实现返回true的onDown()方法是最佳做法。这是因为所有手势都以onDown()消息开头。如果从onDown()返回false,默认情况下GestureDetector.SimpleOnGestureListener会执行false,系统会假定您要忽略其余的手势,而GestureDetector.OnGestureListener的其他方法永远不会被调用。这可能会在您的应用中导致意外问题。你应该从onDown()返回false的唯一一次是你真的想忽略整个手势。

您未实施onDown()方法的事实导致了副作用。