Android 避免在不使用 onSingleTapConfirmed 的情况下为双击调用单击两次
Android avoid calling single tap twice for double tap, without using onSingleTapConfirmed
我的应用程序有一个可单击的视图,然后当单击此视图时,应调用 handleClickEvent()。我尝试为视图设置 OnClickListener,但是当用户双击视图时,handleClickEvent() 被调用两次。我不希望它在双击期间被调用两次。 IE。我希望 handleClickEvent() 在单击和双击时被调用一次。
我做了一些研究并发现了这个问题:Android detecting double tap without single tap first我尝试了答案中的建议,即使用 onSingleTapConfirmed() 方法实现 GestureDetector。这行得通,但是我注意到与使用 OnClickListener 相比,响应时间有明显的延迟。我猜是因为 onSingleTapConfirmed() 只有在系统通过等待某个时间段确认这是一次点击后才会调用。
有没有办法在没有明显延迟的情况下实现这一点?我能想到的另一个选择是有一个 lastClickedTimeStamp 成员变量,将单击时的当前时间与 lastClickedTimeStamp 进行比较,如果它在某个阈值内,则不执行任何操作。
请问还有其他选择吗?
谢谢!
我的做法是将状态变量设置为 long 并将其命名为 timeOfLastTouch 并将其设置为 0。然后在每个 OnClickListener 函数中将此代码放入
long currentTime = System.currentTimeMillis();
if (timeOfLastTouch + 100 < currentTime) {
// code
timeOfLastTouch = System.currentTimeMillis();
}
您可以尝试使用 GestureDetector.SimpleOnGestureListener
并将其与 onTouchEvent 结合使用。
private GestureDetector gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
Log.d("SingleTap", " is detected");
return true;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
Log.d("DoubleTap", " is detected");
return true;
}
});
然后,删除 onClickListener 并在该视图上设置触摸事件
yourView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
});
我的应用程序有一个可单击的视图,然后当单击此视图时,应调用 handleClickEvent()。我尝试为视图设置 OnClickListener,但是当用户双击视图时,handleClickEvent() 被调用两次。我不希望它在双击期间被调用两次。 IE。我希望 handleClickEvent() 在单击和双击时被调用一次。
我做了一些研究并发现了这个问题:Android detecting double tap without single tap first我尝试了答案中的建议,即使用 onSingleTapConfirmed() 方法实现 GestureDetector。这行得通,但是我注意到与使用 OnClickListener 相比,响应时间有明显的延迟。我猜是因为 onSingleTapConfirmed() 只有在系统通过等待某个时间段确认这是一次点击后才会调用。
有没有办法在没有明显延迟的情况下实现这一点?我能想到的另一个选择是有一个 lastClickedTimeStamp 成员变量,将单击时的当前时间与 lastClickedTimeStamp 进行比较,如果它在某个阈值内,则不执行任何操作。
请问还有其他选择吗?
谢谢!
我的做法是将状态变量设置为 long 并将其命名为 timeOfLastTouch 并将其设置为 0。然后在每个 OnClickListener 函数中将此代码放入
long currentTime = System.currentTimeMillis();
if (timeOfLastTouch + 100 < currentTime) {
// code
timeOfLastTouch = System.currentTimeMillis();
}
您可以尝试使用 GestureDetector.SimpleOnGestureListener
并将其与 onTouchEvent 结合使用。
private GestureDetector gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
Log.d("SingleTap", " is detected");
return true;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
Log.d("DoubleTap", " is detected");
return true;
}
});
然后,删除 onClickListener 并在该视图上设置触摸事件
yourView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
});