Android 如何检测双击?

Android How to detect double tap?

我正在尝试在 android 的 DoubleTap 上刷新 Canvas。我在自定义 View.

中使用 GestureDetector
final GestureDetector mDetector = new GestureDetector(
    getContext(), new GestureDetector.OnGestureListener() {

    @Override
    public boolean onDoubleTap(MotionEvent e) {
        invalidate();
        return true;
    }
}

但是我收到了错误

The method onDoubleTap(MotionEvent) of type new GestureDetector.OnGestureListener(){} must override or implement a supertype method

Remove '@Override' annotation

解决方案。我删除覆盖并收到此警告

The method onDoubleTap(MotionEvent) from the type new GestureDetector.OnGestureListener() {} is never used locally.

然后我尝试测试这是否有效,并创建了一个函数来在我 DoubleTap 时更改 TextView 字符串。没有任何反应。

我也查看了 GestureDetector Reference 的解释,但他们甚至没有 DoubleTap 那里,每个人都使用。我该怎么办?

试试这个

final GestureDetector mDetector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener {

    @Override
    public boolean onDown(MotionEvent e) {

        return true;
    }

    @Override
    public boolean onDoubleTap(MotionEvent e) {

        return true;
    }
});

对于那些想知道如何将它也设置为相应视图的人:

final GestureDetector gDetector = new GestureDetector(getBaseContext(), new GestureDetector.SimpleOnGestureListener() {

    @Override
    public boolean onDown(MotionEvent e) {
        return true;
    }

    @Override
    public boolean onDoubleTap(MotionEvent e) {
        doIt();
        return true;
    }
});

// Set it to the view
mButton.setOnTouchListener((v, event) -> gDetector.onTouchEvent(event));

我解决这个问题的方法是不同的,因为我也需要为 onClick 侦听器执行一些操作,而且它是在列表视图中,所以我需要知道项目内容是什么。 这是我使用 kotlin Job 的方法: 在 class 的顶部,我声明了如下内容:

private var doubleTapTimerJob: Job = Job()
private var clickedViewItem: CartViewItem? = null
val DOUBLE_TAP_DELAY = 200L

其中 CartViewItem 是列表中使用的模型。 这是我的 onClickListener 逻辑:

if (clickedViewItem == null || clickedViewItem != cartViewItem) {
    doubleTapTimerJob.cancel()
    doubleTapTimerJob = lifecycleScope.launch {
        delay(DOUBLE_TAP_DELAY)
        clickedViewItem = null
    }
    clickedViewItem = cartViewItem
    onClicked(cartViewItem)
} else {
    onDoubleClicked(cartViewItem)
    clickedViewItem = null
    doubleTapTimerJob.cancel()
}

这里我等待第二次点击 200 毫秒,如果没有发生,我会将 clickedViewItem 设置为 null,因此它不再有效