【问题标题】:GestureDetector.SimpleOnGestureListener and GestureDetectorCompat don't work. What's wrong with my code?GestureDetector.SimpleOnGestureListener 和 GestureDetectorCompat 不起作用。我的代码有什么问题?
【发布时间】:2013-11-12 18:52:24
【问题描述】:

我正在关注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(怀疑这是一个长的点击检测延迟)。

有什么收获?

【问题讨论】:

  • 您是否尝试将return super.onTouchEvent(event); 更改为return false;?并在 Simple View 上尝试您的操作(例如 WebView 示例)。
  • @R.id.pandacoder: return false; 不会改变任何东西。
  • 经过一番调查,我认为您可以尝试添加 onDown 方法,该方法返回 true 到您的 onTouchEvent 方法。
  • 您将始终提供onLongPress,因为您的手势检测器上从未处理过MotionEvent.ACTION_DOWN。你总是会给ACTION_UP。为什么没有 ACTION_MOVE?因为在Android Action_Move 进动之后他给了Action_UP。所以手势检测器会像长按一样处理你的动作。
  • @R.id.pandacoder:谢谢!没有默认实现,或者onDown 不是抽象的,这似乎很愚蠢……

标签: android gesture-recognition gestures


【解决方案1】:

我引用Android Guide on Detecting Common Gestures

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

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

【讨论】:

  • 奇怪的是,我遇到了与 OP 相同的问题,只是我的 onLongPress 方法被调用得很好,尽管没有 onDown 返回 true
猜你喜欢
  • 1970-01-01
  • 2019-11-06
  • 1970-01-01
  • 2021-10-29
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
相关资源
最近更新 更多