Нажмите Слушатели для перекрывающихся представлений

Мне было интересно, возможно ли иметь Views, сидящие друг над другом, и отдельные слушатели для них. В частности, у меня есть два представления, которые точно расположены друг над другом и имеют одинаковые размеры, и я пытаюсь реализовать событие движения OnTouchListener для view_one и OnLongPressListener для view_two. Однако OnTouchListener для view_one, похоже, блокирует OnLongClickListener для view_one.

Основная цель кода состоит в том, чтобы несколько сенсорных взаимодействий выполняли разные действия:

  1. Короткий щелчок делает одну вещь
  2. Длительное нажатие делает другое
  3. Сенсорное перетаскивание и отпускание в вертикальном направлении делает другую вещь
  4. Коснитесь и перетащите по горизонтали другой

И так далее, как можно больше разных вещей.

Может быть, мне нужно просто иметь одно представление, предназначенное для касания, а не два, и есть способ отделить касания и события движения. Я знаю, как разделить короткие и длинные события нажатия, но событие движения все портит.

Я уверен, что есть гораздо лучший способ сделать это. Любые подсказки или предложения очень ценятся. Есть ли способ установить ограничения на длину движения слайда и продолжительность касания, которые помогут определить, какое действие предпринять?


person jdods    schedule 29.03.2013    source источник
comment
Спасибо за правки, я новичок в этом, поэтому в следующий раз поработаю над форматированием. Такие комментарии считаются не по теме и запрещены?   -  person jdods    schedule 29.03.2013
comment
если 2 вида имеют одинаковые размеры, зачем вам нужно обнаруживать прикосновения к обоим, а не просто потреблять прикосновения к виду сверху. длительное нажатие на вид 1 аналогично долгому нажатию на вид 2, если они имеют одинаковые размеры и расположение...   -  person ab11    schedule 29.03.2013
comment
Да, я думаю, что вы правы... Я просто ошибался. Решение Кайла ниже решило мою проблему.   -  person jdods    schedule 30.03.2013


Ответы (1)


Чтобы ответить на первую часть вашего вопроса: если прослушиватель касания использует событие до того, как оно достигнет 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.

person klmprt    schedule 29.03.2013
comment
Хорошо, это имеет большой смысл. Еще немного погуглив и проделав большую работу, я смог реализовать это. Спасибо!!! Я думаю, что выше есть пара опечаток: getAction(). Мне пришлось добавить скобки, чтобы заставить его работать. Кроме того, getDownTime() доставил мне некоторые проблемы, так как это дает системе время работы, когда произошло событие down, поэтому мне пришлось реализовать getEventTime(), чтобы получить время, когда произошло событие up, а затем взять разницу для сравнения с любым пороговым значением. раз заявляю. - person jdods; 30.03.2013