Двойное касание и Одно касание
Только двойное нажатие
С помощью SimpleOnGestureListener
довольно легко обнаружить двойное касание вида (как показано в ответе Ханнеса Нидерхаузена ).
private class GestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
return true;
}
}
Я не вижу большого преимущества в повторном изобретении логики для этого (например, ответ Буги ).
Двойное и однократное нажатие с задержкой
Вы также можете использовать SimpleOnGestureListener
, чтобы различать одно касание и двойное касание как взаимоисключающие события. Для этого просто переопределите onSingleTapConfirmed
. Это задержит выполнение кода одним нажатием, пока система не убедится, что пользователь не нажал дважды (т. Е. Задержка> ViewConfiguration.getDoubleTapTimeout()
). Определенно нет причин заново изобретать всю логику для этого (как это сделано в , , , и других ответах).
private class GestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
return true;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
return true;
}
}
Двойное и однократное нажатие без задержки
Потенциальная проблема с onSingleTapConfirmed
- задержка. Иногда заметная задержка недопустима. В этом случае вы можете заменить onSingleTapConfirmed
на onSingleTapUp
.
private class GestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return true;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
return true;
}
}
Тем не менее, вы должны понимать, что и onSingleTapUp
и onDoubleTap
будут вызываться при двойном нажатии. (Это, по сути, ответ bughi и то, на что жаловались некоторые комментаторы.) Вам нужно либо использовать задержку, либо вызвать оба метода. Невозможно выполнить одно касание без задержки и в то же время узнать, собирается ли пользователь снова нажать.
Если задержка одним касанием для вас неприемлема, у вас есть пара вариантов:
- Примите, что оба
onSingleTapUp
и onDoubleTap
будут вызваны для двойного нажатия. Просто разделите свою логику соответствующим образом, чтобы она не имела значения. По сути, это то, что я сделал, когда реализовал двойное касание для caps-lock на пользовательской клавиатуре.
Не используйте двойной тап. Это не интуитивно понятный пользовательский интерфейс для большинства вещей. Как Дейв Уэбб предлагает , длинное нажатие, вероятно, лучше. Вы также можете реализовать это с помощью SimpleOnGestureListener
:
private class GestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return true;
}
@Override
public void onLongPress(MotionEvent e) {
}
}