我正在尝试在 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
。我该怎么办?
试试这个
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为空,因此它不再有效
详细来说,如果您没有先处理相应的
ACTION_MOVE
事件,即在侦听器中返回 ACTION_UP
,Android 不会将 ACTION_DOWN
和 true
事件传递给您的侦听器。
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.
// ...
}
}
view.setOnTouchListener { _, event ->
gestureDetector.onTouchEvent(event) || event.actionMasked == MotionEvent.ACTION_DOWN
}