Одной из наиболее важных парадигм пользовательского интерфейса для современных мобильных телефонов является их сенсорный интерфейс с возможностью касания. Наиболее очевидным примером этого является представление пейджера, которое позволяет пользователю интуитивно пролистывать страницы информации. Наиболее известным примером этого является домашний экран iOS, который размещает приложения в сетке на нескольких страницах. Это оказалось настолько успешным, что оно использовалось во многих других местах и было напрямую скопировано другими производителями телефонов.
Когда я начал программировать для Android, я предполагал, что будет готовый компонент, или, по крайней мере, один, который можно легко настроить для выполнения постраничного представления. Оказалось, что это не так, поэтому мне пришлось погрузиться в исходный код Android, чтобы найти способ его реализации (и, кроме того, это встроенная функция iOS). Я думал, что поделюсь с вами плодами своего труда.
Исследуя
Сначала я начал играть с ViewFlipper, используя жесты, чтобы обеспечить ввод данных для смены страниц. Это работало, но не давало правильной обратной связи пользователю во время прокрутки. Когда пейджер прокручивает, пользователь ожидает, что страница будет перемещаться с помощью прокрутки. При таком подходе страница не анимируется, пока жест смахивания не будет завершен.
Затем я поиграл с идеей написать свой собственный компонент прокрутки с нуля. Это дало бы мне большую гибкость, но потребовало бы много усилий. Как правило, гораздо лучше строить на существующих компонентах, чем писать свои, поэтому у меня был последний трал через API, чтобы посмотреть, что я мог бы использовать. Именно тогда я нашел HorizontalScrollView .
Это действует как традиционный вид прокрутки, за исключением того, что он работает горизонтально, что именно то, что я хочу. Он также предоставляет привязки клавиш бесплатно, что является бонусом. Единственными недостающими частями являются метод, позволяющий привязать его к границе страницы, когда пользователь отпускает палец, простой в использовании API для добавления и удаления страниц и индикатор страницы для отображения текущей страницы. Я создал подкласс и начал настраивать его так, чтобы получить желаемый эффект.
Простое управление страницами
HorizontalScrollView
принимает только один дочерний вид по умолчанию, и программист должен убедиться, что он имеет правильный размер. Я хотел иметь несколько дочерних представлений или страниц, и каждая страница должна была занимать весь видовой экран. Для этого я добавил метод addPage()
, который будет принимать вид, изменяя его размер до размера области просмотра, и добавляя его в LinearLayout
который служил в качестве дочернего представления ScrollView
.
public class Pager extends HorizontalScrollView { private LinearLayout contents; ... public void addPage(View child) { int width = getWidth(); child.setLayoutParams(new LayoutParams(width, LayoutParams.FILL_PARENT)); contents.addView(child); contents.requestLayout(); firePageCountChanged(); } ... }
Привязка к границе страницы
Для этого мы просто слушаем события smoothScrollTo()
, а затем выполняем последний smoothScrollTo()
чтобы прокрутить назад до ближайшей границы страницы.
public boolean onTouchEvent(MotionEvent evt) { boolean result = super.onTouchEvent(evt); int width = getWidth(); if (evt.getAction() == MotionEvent.ACTION_UP) { int pg = (getScrollX() + width / 2) / width; smoothScrollTo(pg * width, 0); } return result; }
Дополнительный код требуется для обработки событий на основе клавиатуры аналогичным образом, и я оставляю это упражнение для читателя.
Пейджер на GitHub содержит полный исходный код в PagingScrollerExample .
Индикатор страницы
По умолчанию на горизонтальной панели прокрутки отображается полоса прокрутки стандартного стиля, когда прокручивается панель прокрутки, которая исчезает через несколько секунд. Это нормально в большинстве случаев, и это именно то, что я использовал на NodeDroid , моем приложении для проверки использования. Но я подумал, что было бы неплохо иметь индикатор страницы в стиле iOS в нижней части экрана.
Это было реализовано путем создания отдельного компонента пользовательского представления для отображения страниц, который я назвал PageIndicator . Этот компонент существует независимо от пейджера, так что вы можете разместить представление там, где вы хотите. В начале своей деятельности вы просто указываете индикатору страницы, какой пейджер слушать, и он автоматически обновляется с этого момента.
Чтобы пейджер обновлялся правильно, он должен знать, когда страница изменяется, и когда страницы добавляются или удаляются из пейджера. Необъяснимо, что в Android нет прослушивателя по умолчанию для ScrollView, поэтому единственный способ получить уведомление — перехватить его в подклассе с onScrollChanged
метода onScrollChanged
. В своем коде я создал второй набор классов Listener / Event с именем OnPageChangeListener
, с двумя событиями с именами onPageChange()
и onPageCountChange()
.
PageIndicator на GitHub содержит полный исходный код в PagingScrollerExample .
Попробуйте сами
Я создал пример приложения, которое демонстрирует использование представления, и код доступен на GitHub. Проверьте PagingScrollerExample . Если вы хотите попробовать его, клонируйте репозиторий, загрузите проект в Eclipse (с установленным плагином ADT для Eclipse ), и вы должны уйти.