Android如何检测双击

Android How to detect double tap?

本文关键字:检测 双击 何检测 Android      更新时间:2023-09-26

我正在尝试在android的DoubleTap上刷新Canvas。我在自定义View中使用GestureDetector

final GestureDetector mDetector = new GestureDetector(
    getContext(), new GestureDetector.OnGestureListener() {
    @Override
    public boolean onDoubleTap(MotionEvent e) {
        invalidate();
        return true;
    }
}

但是我得到了错误

类型为new的onDoubleTap(MotionEvent)方法GestureDetector.OnGestureListener(){}必须覆盖或实现超类型方法

Remove '@Override' annotation

解决方案。我删除覆盖,得到这个警告

来自new类型的onDoubleTap(MotionEvent)方法GestureDetector.OnGestureListener(){}从未在本地使用。

然后我试着测试这是否有效,并做了一个函数来改变TextView字符串每当我DoubleTap。什么也不会发生。

我还查看了gestredetector Reference以寻求解释,但他们甚至没有每个人都使用的DoubleTap。我该怎么办?

try this

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的方法:在类的顶部,我声明了如下内容:

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为空,所以它不再有效