Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: jdodsОтветов: 1

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

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

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

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

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

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

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

androidviewtouchmotion

Ответы

Ответ 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.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы