View.onTouchEvent регистрирует только событие ACTION_DOWN

Я реализую пользовательский TextView и хочу выполнить какое-то действие при касании представления. Я полагал, что метод onTouchEvent даст мне полный набор касаний в представлении без использования setOnTouchListener (я пытаюсь выполнять всю свою работу внутри представления, а не в действии, поэтому оно переносимо), но единственное зарегистрированное событие касания это ACTION_DOWN. Если я установлю OnTouchListener в действии, используя это, я получу полный диапазон сенсорных событий, а onTouchEvent — нет.

Кто-нибудь знает, почему это так, или кто-нибудь может предложить мне решение, которое не включает использование setOnTouchListener (что помешает реализации деятельности установить собственный прослушиватель)?


person Jason Robinson    schedule 17.06.2011    source источник


Ответы (2)


Вам нужно вернуть true, чтобы получить следующие события после падения.

person hackbod    schedule 17.06.2011
comment
Если я это сделаю, то любые прослушиватели касаний/щелчков, примененные к действию, никогда не сработают. Я не хочу отключать функциональность. Я просто хочу перехватывать любые касания до того, как они будут отправлены, но все же отправлять их. Вызов dispatchTouchEvent просто снова вызывает onTouchEvent, вызывая переполнение стека (смеется). - person Jason Robinson; 18.06.2011
comment
Если вы находитесь в контейнере ViewGroup, вы можете переопределить onInterceptTouchEvent(), чтобы отслеживать события касания, отправляемые вашим дочерним элементам. Кроме того (или прямое подключение к dispatchTouchEvent -- не рекомендуется), вы не можете делать то, что хотите. Отправка MotionEvent основана на поиске цели через первого получателя, который возвращает true, а затем отправке всех последующих событий этой цели. - person hackbod; 23.06.2011
comment
Справедливо. Я предполагаю, что тогда мне нужно знать, как иметь прослушиватель касаний в пользовательском представлении, который не запрещает классу реализации иметь свой собственный полнофункциональный прослушиватель касаний, но вы определенно ответили на вопрос в заголовке. - person Jason Robinson; 24.06.2011
comment
Почему бы вам просто не поместить свой код монитора событий в dispatchTouchEvent? @Override public boolean dispatchTouchEvent (MotionEvent ev) { // Отслеживайте события касания здесь, а не внутри onTouchEvent, затем отправляйте их как обычно return super.dispatchTouchEvent(); } - person Santacrab; 02.04.2015

вернуть true в событии onTouch(). Это означает, что мы все еще ждем некоторых новых действий от этого события, поэтому другие события, такие как OnClick(), отключены.

На действие ACTION_UP нужно возвращать false хотя бы для того, чтобы не было проблем с другими событиями после него.

person niek tuytel    schedule 16.12.2020