Android: используйте RealViewSwitcher для переключения между видами, как это делает домашний экран - PullRequest
3 голосов
/ 16 декабря 2010

Я работаю над небольшим, но приятным проектом с открытым исходным кодом: RealViewSwitcher, который позволяет переключаться между несколькими представлениями, выполняя горизонтальное перемещение - как это делает Launcher из Android. Это просто ViewGroup, который реализует onInterceptTouchEvent и onTouchEvent, чтобы заставить вещи работать. Фактически большая часть кода взята из файла Workspace.java (строка 572 и последующие), так же как и два метода обработки событий касания - без особых изменений.

Однако я не заставляю эту вещь работать. Мой текущий рабочий класс размещен здесь (на pastebin, потому что он довольно большой): http://pastebin.com/8p8GCEZK

Если я выполняю свой класс (просто создав его, добавив несколько TextViews, а затем установив его в качестве представления содержимого упражнения), я получу следующий вывод, если сделаю быстрый бросок:

12-15 23:53:04.797: INFO/RealViewSwitcher(7477): intercept ACTION_DOWN
12-15 23:53:04.797: INFO/RealViewSwitcher(7477): touch ACTION_DOWN
12-15 23:53:04.807: INFO/RealViewSwitcher(7477): touch ACTION_MOVE
12-15 23:53:04.840: INFO/RealViewSwitcher(7477): touch ACTION_MOVE
12-15 23:53:04.867: INFO/RealViewSwitcher(7477): touch ACTION_MOVE
12-15 23:53:04.897: INFO/RealViewSwitcher(7477): touch ACTION_MOVE
12-15 23:53:04.897: INFO/RealViewSwitcher(7477): touch ACTION_UP

Теперь моя проблема: что бы я ни делал, я не получаю ACTION_MOVE в моем onInterceptTouchEvent методе. Я прочитал документацию несколько раз и попытался поиграть с возвращаемыми значениями, но я не получил никаких других событий, кроме ACTION_DOWN, что ужасно, потому что фактический код, запускающий сброс, находится в случае ACTION_MOVE .

Можете ли вы помочь мне здесь? Раздражающая вещь, которую я не могу получить: похоже, она реализована таким же образом в официальном приложении Launcher. Но их код работает, мой нет. Чего мне не хватает?

Ответы [ 3 ]

2 голосов
/ 05 февраля 2012

На самом деле все довольно просто:

1) если вы вернете false из onInterceptTouchEvent:

  • текущее событие, после его обработки, если вы хотите, ТАКЖЕ будет отправлено методу onTouchEvent целевого (дочернего) представления;
  • следующее событие все еще будет отправлено в onInterceptTouchEvent

2) если вы вернете true из onInterceptTouchEvent:

  • текущее событие не будет обработано целевым представлением, которое получит то же событие, но с действием ACTION_CANCEL;
  • ВСЕ последующие события будут доставлены в метод onTouchEvent этого представления и больше не будут отображаться в onInterceptTouchEvent.

Таким образом, вы используете опцию 1), если вы хотите обрабатывать события внутри onInterceptTouchEvent (), а также перенаправлять их в целевое представление, и опцию 2), если вы хотите взять на себя весь поток событий, отрезав целевое представление и обработку все события в представлении вашего родителя onTouchEvent (), как если бы это была исходная цель.

Я проверил вариант 1), и он работает для меня.

0 голосов
/ 18 сентября 2011

это потому, что если ваши дети не реагируют на клики, это означает, что они не примут никакого события касания.в настоящее время, если ваша группа просмотра также не принимает событие касания, система представления Android не будет рассматривать вашу группу просмотра и ее потомки как цель события касания, поэтому система просмотра Android передает событие касания родительскому элементу вашей группы просмотра.(nonclickable означает, что textview не примет touchevent)

0 голосов
/ 04 января 2011

У меня была такая же проблема, как и у вас. Я не уверен, что это сработает для вас, но это было решено путем установки дочернего элемента моей пользовательской ViewGroup в значение «true».

...