Android 如何检测双击?

问题描述 投票:0回答:4

我正在尝试在 Android 中刷新

Canvas
上的
DoubleTap
。我在自定义
GestureDetector
中使用
View

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
字符串。什么也没发生。

我还查看了 GestureDetector Reference 来获取解释,但他们甚至没有每个人都使用的

DoubleTap
。我该怎么办?

javascript android double-click gesturedetector
4个回答
2
投票

试试这个

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;
    }
});

1
投票

对于那些想知道如何将其设置到相应视图的人:

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));

0
投票

我解决这个问题的方法是不同的,因为我还需要为 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为空,因此它不再有效


0
投票

详细来说,如果您没有先处理相应的

ACTION_MOVE
事件,即在侦听器中返回
ACTION_UP
,Android 不会将
ACTION_DOWN
true
事件传递给您的侦听器。

选项1

val listener = object: SimpleOnGestureListener() {

    override fun onDown(e: MotionEvent): Boolean {
        return true // <<< This bit is important.
    }

    override fun onDoubleTap(e: MotionEvent): Boolean {
        // This now works.
        // ...
    }

    override fun onDoubleTapEvent(e: MotionEvent): Boolean {
        // This now works.
        // ...
    }

    override fun onSingleTapConfirmed(e: MotionEvent): Boolean {
        // This now works.
        // ...
    }
}

选项2

view.setOnTouchListener { _, event -> 
    gestureDetector.onTouchEvent(event) || event.actionMasked == MotionEvent.ACTION_DOWN
}
© www.soinside.com 2019 - 2024. All rights reserved.