2013-03-29 6 views
0

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

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

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

Etc, так как многие разные вещи насколько это возможно.

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

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

+0

Спасибо за изменения, я новичок в этом, поэтому я буду работать над форматированием в следующий раз. Такие комментарии считаются несовместимыми и не допускаются? – jdods

+0

, если 2 вида имеют одинаковые размеры, почему вам нужно обнаруживать штрихи на обоих, вместо того чтобы просто потреблять штрихи на вид сверху. длительное нажатие на просмотр 1 такое же, как при длительном нажатии на вид 2, если они имеют одинаковые размеры и расположение ... – ab11

+0

Да, я думаю, вы правы ... Я просто все это делал неправильно. Решение kyle ниже решило мою проблему. – jdods

ответ

0

Чтобы ответить на первую часть вашего вопроса - если прослушиватель прикосновений потребляет событие до того, как он достигнет view_two (вид внизу), это может быть связано с тем, что вы потребляете событие касания в своем onTouchListener.

//Returns true if the listener has consumed the event, false otherwise. 
public abstract boolean onTouch (View v, MotionEvent event) 

Вы всегда возвращаются ложь в этом методе? Если нет, есть события, которые, вероятно, не будут распространяться на следующее представление в иерархии.

Что касается вашего второго вопроса - да, вы можете создать 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.

+0

Хорошо, это делает много смысла. С некоторыми другими поисковыми процессами и множеством работ я смог реализовать это. Благодаря!!! Я думаю, что есть пара опечаток выше: getAction(). Мне пришлось добавить круглые скобки, чтобы заставить его работать. Кроме того, getDownTime() дал мне некоторую проблему, так как это дало время, в течение которого произошло событие down, поэтому мне пришлось реализовать getEventTime(), чтобы получить время, в которое произошло событие up, а затем принять разницу, чтобы сравнить с любым порогом раз заявляю. – jdods