3

我有一个带有 GestureDetector 和扩展 SimpleOnGestureListener 的 GLSurfaceView。我需要能够通过快速点击它们来选择表面视图上的多个项目。我覆盖了 onSingleTapUp 以快速检测触摸,因为 onSingleTapConfirmed 太慢了。现在的问题是,如果表面视图上的两个项目彼此靠近并且用户快速点击一个然后另一个,那么 onSingleTapUp 方法会为第一个项目调用,而不是第二个。第二个调用 onDoubleTap 方法,无论它是否被覆盖。

为了解决这个问题,我尝试简单地不覆盖 onDoubleTap 方法,并且我还尝试在覆盖的 onDoubleTap 中不执行任何操作并返回 false。两者都解决不了问题。第二次点击仍然不会调用 onSingleTapUp 方法。

我决定尝试在 onDoubleTap 方法中检测第二次点击并从那里选择项目。问题在于从 onDoubleTap 返回的运动事件包含“双击的第一次点击的向下运动事件”。- http://developer.android.com/reference/android/view/GestureDetector.OnDoubleTapListener.html

有什么方法可以禁用双击,更改双击时间使其永远不会触发,将双击半径更改为非常小的值,或者在 onDoubleTap 方法中获取第一个点击位置?

这是我的 SimpleOnGestureListener:

public class ViewGestureListener extends
    GestureDetector.SimpleOnGestureListener {

    private ViewRenderer renderer;
    private GLSurfaceView surfaceView;

    public ViewGestureListener(GLSurfaceView surfaceView,
        ViewRenderer renderer) {
        this.renderer = renderer;
        this.surfaceView = surfaceView;
    }

    // Pan
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
        float distanceY) {
        renderer.pan(distanceX, distanceY);
        surfaceView.requestRender();
        return true;
    }

    // Double touch and release
    @Override
    public boolean onDoubleTap(MotionEvent e) {
        // Note: e.getX() doesn't return the second tap's location!
        renderer.singleTouch(e.getX(), e.getY());
        surfaceView.requestRender();
        return true;
    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        renderer.singleTouch(e.getX(), e.getY());
        surfaceView.requestRender();
        return true;
    }
}

谢谢,马特

4

3 回答 3

2

我可能来不及帮助这篇文章的作者,但我刚刚遇到了同样的问题,所以这里是其他想知道它的人的答案。

回答:

您需要覆盖以下方法,它将为您提供第二次点击的向下、移动和向上事件:

onDoubleTapEvent(MotionEvent e)

如果你想要第二次点击的向上运动,那么:

onDoubleTapEvent(MotionEvent e) {
         if(e.getAction() != MotionEvent.ACTION_UP) {
                return false;  // Don't do anything for other actions
         }


         // YOUR CODE HERE

         return true;
}

祝你好运!/卡洛斯

于 2016-09-25T18:40:27.710 回答
1

它没有很好的记录,但为了忽略双击,并将其检测为两个单独的水龙头,设置null为双击监听器就足够了。

GestureDetector gd = new GestureDetector(context, gestureListener);
gd.setOnDoubleTapListener(null);

适用于GestureDetectorGestureDetectorCompat

于 2017-09-25T13:56:21.980 回答
0

GestureDetector.OnDoubleTapListener 有以下方法

enter code here
public class ViewGestureListener extends GestureDetector.SimpleOnGestureListener,
GestureDetector.OnDoubleTapListener {

@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
    Log.d(TAG, "onSingleTapConfirmed");
    return false;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
    Log.d(TAG, "onDoubleTap");
    return false;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
    Log.d(TAG,"onDoubleTapEvent");
    return false;
}

OnDoubleTapEvent 在每次双击后调用。您可以在此处返回 true 并分别获取每个水龙头。

于 2019-07-27T00:03:24.993 回答