手势侦听器 GestureDetector.SimpleOnGestureListener 和 GestureDetectorCompat 不起作用。我的代码有什么问题?

11

我正在遵循检测常见手势指南。我已经链接了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 (怀疑是长按检测延迟)。
有什么问题吗?

你尝试将 return super.onTouchEvent(event); 更改为 return false; 吗?并在简单视图上尝试您的操作(例如 WebView)。 - user2558337
@R.id.pandacoder: return false; 不会改变任何东西。 - Violet Giraffe
1
经过一些调查,我认为你可以尝试在onTouchEvent方法中添加返回true的onDown方法。 - user2558337
你总是会提供 onLongPress,因为 gestureDetector 从未处理过 MotionEvent.ACTION_DOWN。你总是会提供 ACTION_UP。为什么没有 ACTION_MOVE?因为在 Android 中,Action_Move 在 Action_UP 之后处理。所以手势检测器将处理您的操作,就像长按一样。 - user2558337
@R.id.pandacoder:谢谢!看起来很傻,没有默认实现,或者onDown不是抽象的... - Violet Giraffe
1个回答

22

我引用了Android关于检测常见手势的指南:

无论你是否使用GestureDetector.OnGestureListener,最佳实践是实现一个返回true的onDown()方法。这是因为所有手势都始于onDown()消息。如果你从onDown()返回false(与GestureDetector.SimpleOnGestureListener默认情况下所做的相同),则系统会假定您想要忽略其余的手势,而GestureDetector.OnGestureListener的其他方法将不会被调用。这可能会在您的应用程序中引起意外的问题。只有当您真正想要忽略整个手势时,才应该从onDown()返回false。

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


很奇怪,我和楼主遇到了同样的问题,尽管我的onLongPress方法没有返回true,但它仍然被正常调用。 - AgentKnopf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接