禁用双击或检测第二个点击位置

时间:2012-05-30 21:15:40

标签: android

我有一个带有GestureDetector的GLSurfaceView和一个扩展的SimpleOnGestureListener。我需要通过快速点击表面视图来选择多个项目。由于onSingleTapConfirmed太慢,我重写onSingleTapUp以快速检测触摸。现在的问题是,如果表面视图上的两个项目彼此靠近并且用户快速点击一个然后另一个项目,那么将为第一个项目调用onSingleTapUp方法,而不是针对第二个项目调用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;
    }
}

谢谢, 马特

3 个答案:

答案 0 :(得分:2)

我可能来得太晚,无法帮助这篇文章的作者,但我只是面临同样的问题,所以这里有其他人对此感到疑惑的答案。

<强>解答:

您需要覆盖以下方法,它会为您提供第二次点按的向下,向下和向上事件:

  

onDoubleTapEvent(MotionEvent e)

如果你想要第二次点击的UP动作,那么:

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


         // YOUR CODE HERE

         return true;
}
祝你好运! /卡洛斯

答案 1 :(得分:1)

没有详细记录,但为了忽略双击,并将其检测为两个单独的点击,它足以将GestureDetector gd = new GestureDetector(context, gestureListener); gd.setOnDoubleTapListener(null); 设置为双击侦听器。

GestureDetector

适用于GestureDetectorCompat和{{1}}。

答案 2 :(得分: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并单独获得每个点击。