Мне было интересно, возможно ли иметь Views, сидящие друг над другом, и отдельные слушатели для них. В частности, у меня есть два представления, которые точно расположены друг над другом и имеют одинаковые размеры, и я пытаюсь реализовать событие движения OnTouchListener для view_one и OnLongPressListener для view_two. Однако OnTouchListener для view_one, похоже, блокирует OnLongClickListener для view_one.
Основная цель кода состоит в том, чтобы несколько сенсорных взаимодействий выполняли разные действия:
- Короткий щелчок делает одну вещь
- Длительное нажатие делает другое
- Сенсорное перетаскивание и отпускание в вертикальном направлении делает другую вещь
- Коснитесь и перетащите по горизонтали другой
И так далее, как можно больше разных вещей.
Может быть, мне нужно просто иметь одно представление, предназначенное для касания, а не два, и есть способ отделить касания и события движения. Я знаю, как разделить короткие и длинные события нажатия, но событие движения все портит.
Я уверен, что есть гораздо лучший способ сделать это. Любые подсказки или предложения очень ценятся. Есть ли способ установить ограничения на длину движения слайда и продолжительность касания, которые помогут определить, какое действие предпринять?
Ответ 1 · klmprt
Чтобы ответить на первую часть вашего вопроса: если прослушиватель касания использует событие до того, как оно достигнет view_two (нижнее представление), это может быть связано с тем, что вы потребляете событие касания в своем onTouchListener.
//Returns true if the listener has consumed the event, false otherwise.
public abstract boolean onTouch (View v, MotionEvent event)
Вы всегда возвращаете false в этом методе? Если нет, то есть события, которые, вероятно, не будут переданы в следующее представление в иерархии.
Что касается вашего второго вопроса - да, вы, безусловно, можете создать onTouchListener для обработки всех этих событий. Вот пример, который делает короткое и длинное нажатие (независимо от того, сколько движения):
private MotionEvent downEvent;
public abstract boolean onTouch (View v, MotionEvent event){
if (downEvent == null && event.getAction == MotionEvent.ACTION_DOWN){
downEvent = event;
return false;
}
if (event.getAction == MotionEvent.ACTION_UP){
if (event.getDownTime() > LONG_PRESS_THRESHOLD){
... do something ...
} else if (event.getDownTime() > SHORT_PRESS_THRESHOLD){
... do something else ...
}
}
}
Как вы можете себе представить, потребуется немного больше усилий, чтобы определить, соответствует ли дельта X / дельта Y между вашим событием падения и текущим событием пороговому значению, которое вы определили для событий 3 и 4.