Представления с подключенными OnClickListeners замедляют ScrollView.Что можно сделать? - PullRequest
2 голосов
/ 29 декабря 2010

Итак, в основном, у меня есть ScrollView с множеством различных ViewGroups и представлений, добавленных в него, и моя активность должна реагировать на клики по этим представлениям. К сожалению, OnClickListeners, которые я им установил, замедляют время реакции ScrollViews на более быстрые жесты прокрутки или перемещения (когда они запускаются в рассматриваемых представлениях).

Есть ли способ сделать это правильно или обойти эту проблему?

Ответы [ 4 ]

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

Да, я не уверен, что уменьшение сложности вашего макета поможет вам. Какая версия API работает на вашем устройстве / эмуляторе? Потому что я заметил изменение с 2.1 до 2.2 вокруг запуска события прокрутки в интерактивном представлении, как вы описали.

В моем случае я включаю вложенную прокрутку с помощью метода requestDisallowInterceptTouchEvent(). Обычно это позволило бы мне поместить ScrollView или ListView внутри другого ScrollView и по-прежнему правильно прокручивать его. Однако, начиная с уровня API 8, эта «вложенная прокрутка» больше не работает, если сенсорное событие запускается на «кликабельном» элементе управления! Augh! Я не смотрел на источник, чтобы точно определить, почему это происходит, но похоже, что это связано с вашей проблемой.

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

Edit:
Если вы хотите реализовать «щелчки» другим способом, это, безусловно, возможно. Обычно я бы не рекомендовал это, но тогда я не знаю, насколько плоха ваша прокрутка. До вас.

Если вы хотите это сделать, вы можете добавить OnTouchListener к вашему ScrollView, но я думаю, что это будет более трудный способ сделать это. Вам нужно будет прослушивать события ACTION_UP, но использовать события только в том случае, если соответствующее событие ACTION_DOWN было меньше, чем touchSlop далеко в направлении y (touchSlop - это минимальное расстояние, которое должно пройти касание ListView начнет прокрутку ... он получает это значение из ViewConfiguration). Затем, когда вы используете событие, вам нужно будет добавить ListView.getScrollX() и ListView.getScrollY() к координатам события, чтобы сравнить его с позициями ваших интерактивных элементов управления. И если вы хотите «длинные клики», вам придется проделать больше работы для их реализации. И все это только для сенсорных событий ... вам также нужно добавить ключевой слушатель, чтобы ваши пользователи могли использовать трекбол для его нажатия.

Я думаю, что вместо этого вы можете добавить OnTouchListener для каждого из ваших элементов управления вместо OnClickListener. Проверьте просмотр исходного кода, чтобы увидеть, как регистрируются клики. Если вам не нужно регистрировать «длинные клики», вам будет намного легче. Тогда вы сможете обработать практически любое событие ACTION_UP одним кликом. Вам также понадобится ключевой слушатель, чтобы обрабатывать щелчки трекбола.

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

2 голосов
/ 29 декабря 2010

Я не знаю особенностей платформы Android, но типичная рекомендация - делать как можно меньше в вашем обработчике событий. Быстро проверьте, интересует ли вас это событие, и поставьте задачу в очередь. Используйте другой поток для извлечения задач из очереди, их агрегирования и выполнения.

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

Почему вы думаете, что OnClickListeners делают его медленным?

Установите все прослушиватели кликов на null и попробуйте использовать приложение.Это быстро сейчас?

В противном случае, профиль вашего приложения, чтобы узнать, что медленно.

http://www.jpct.net/wiki/index.php/Profiling_Android_Applications

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

Попробуйте уменьшить количество ViewGroups и Views, возможно, используя RelativeLayout для каждого элемента в представлении прокрутки. Используйте инструмент HierarchyViewer, чтобы проверить глубину своих представлений и, возможно, попробовать советы Ромена Гая по улучшению макета:

http://www.curious -creature.org / 2009/03/01 / андроид-макет-триков-3-оптимизируют-часть-1 /

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