Android GestureDetector.SimpleOnGestureListener和GestureDetectorCompat don';不行。什么';我的代码怎么了?

Android GestureDetector.SimpleOnGestureListener和GestureDetectorCompat don';不行。什么';我的代码怎么了?,android,gesture-recognition,gestures,Android,Gesture Recognition,Gestures,我跟着导游走。我已链接到android-support-v4.jar库以获取GestureDetectorCompat,我的代码与指南中的代码完全相同,只是我在自定义视图中而不是在活动中检测手势: public class MyGlView extends GLSurfaceView { private GestureDetectorCompat m_gestureDetector = null; public MyGlView(Context context, Attrib

我跟着导游走。我已链接到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
。事实上,当我快速点击(快速触摸并释放屏幕)时,当我将手指从屏幕上移开后,我仍然会得到
onlong按住
(怀疑这是一个很长的点击检测延迟)

有什么问题吗?

我引述:

无论您是否使用GestureDetector.OnTestureListener,最好的做法是实现一个返回true的onDown()方法。这是因为所有手势都以onDown()消息开头。如果您从onDown()返回false,默认情况下与GestureDetector.SimpleOnGestureListener一样,系统会假定您希望忽略手势的其余部分,并且GestureDetector.OnGestureListener的其他方法永远不会被调用。这可能会在您的应用程序中导致意外问题。从onDown()返回false的唯一时间是,如果确实要忽略整个手势


您没有实现
onDown()
方法的事实导致了副作用。

您是否尝试更改
返回super.onTouchEvent(事件)
to
返回false?然后在简单视图(例如类似WebView的示例)上尝试您的操作。@R.id.pandacoder:
返回false
不会改变任何东西。经过一些调查后,我认为您可以尝试添加
onDown
方法,该方法返回到您的
onTouchEvent
方法。您将始终提供
onLongPress
,因为
MotionEvent.ACTION\u DOWN
从未在您的gestureDetector上处理过。你总是会放弃行动。为什么不采取行动?因为在Android Action中,在他放弃Action之后,Move继续前进。所以手势检测器会像长按一样处理你的动作。@R.id.pandacoder:谢谢!没有默认的实现,或者说onDown不是抽象的,这似乎很愚蠢……奇怪的是,我和OP有着同样的问题,只是我的onLongPress方法调用得很好,尽管onDown没有返回true