Дифференциация между прокруткой и изменением страницы программы в ViewPager

У меня есть android.support.v4.view.ViewPager в моем приложении, и я хотел бы провести различие между программным инициированным гладким прокруткой и инициированным пользователем сенсорным прокруткой.

Я посмотрел на ViewPager.OnPageChangeListener и я считаю, что ответ может лежать там, но я просто не знаю, как это сделать.

Хорошо, так что получается, что я был прав насчет ответа, лежащего в ViewPager.onPageChangeListener . В частности, он заключается в использовании onPageScrollStateChanged(int state) . По существу, есть три состояния, что страница в ViewPager может находиться в:

  1. Перетаскивание: указывает, что пейджер в настоящее время перетаскивается пользователем.
  2. Idle: Указывает, что пейджер находится в состоянии ожидания, установленном состоянии.
  3. Settling: указывает, что пейджер находится в процессе установки в конечную позицию.

Таким образом, состояние перетаскивания происходит только тогда, когда текущая страница физически перетаскивается пользователем. Таким образом, когда пользователь проведет страницу, состояния будут выполняться в следующем порядке: Перетаскивание -> Урегулирование -> Простой. Теперь метод onPageSelected(int position) вызывается между состояниями «Settling» и «Idle». Таким образом, чтобы определить, было ли изменение страницы вызвано прокруткой пользователя, нужно просто проверить, что предыдущее состояние было «перетаскиванием» и что текущее состояние «Устанавливается». Затем вы можете сохранить boolean переменную для отслеживания того, было ли изменение страницы инициировано пользователем или нет, и проверьте его в onPageSelected(int position) .

Вот мой метод onPageScrollStateChanged

 public void onPageScrollStateChanged(int state) { if (previousState == ViewPager.SCROLL_STATE_DRAGGING && state == ViewPager.SCROLL_STATE_SETTLING) userScrollChange = true; else if (previousState == ViewPager.SCROLL_STATE_SETTLING && state == ViewPager.SCROLL_STATE_IDLE) userScrollChange = false; previousState = state; } 

Операторы if и else if не должны быть настолько явными, но я сделал это для ясности.

Вы правы в использовании ViewPager.OnPageChangeListener :

 @Override public void onPageSelected(int arg0) { // programmatically-initiated } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { // user-initiated touch scroll } 

Кроме того, вы можете использовать логические флаги для различения programmatically-initiated smooth scroll and a user-initiated touch scroll . Например, если вы используете setCurrentItem(int item) для программного изменения страницы, попробуйте:

 boolean progChange = false; .... .... .... progChange = true; setCurrentItem(somePageId); // Set progChange = true every time .... .... .... 

Внутри ViewPager.OnPageChangeListener :

 @Override public void onPageSelected(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { if (progChange) { // programmatically-initiated } else { // user-initiated touch scroll } // Set progChange to false; progChange = false; } @Override public void onPageScrollStateChanged(int arg0) { } 
Intereting Posts
Как правильно подключить приложение Android к сокету RFCOMM на микроконтроллере Arduino с поддержкой Bluetooth? Нормально ли для метода activity.onCreate () вызывать несколько раз Android Custom ListView повторяет выбор фона Как установить приоритет IntentService в Android CollapsingToolbarLayout не работает (рушится) при прокрутке Android-веб-просмотр, файловый файл filechooser не отображается В Android-журнале SDK показано: «Загрузка прервана: подключение к https://dl-ssl.google.com отказалось», что можно сделать? Не удается изменить папку вывода по умолчанию «Не найдено активных совместимых AVD или устройств Imageloader загружает только изображения в списке после того, как listitem ушел с экрана Компилятор Lame MP3 Encoder для Android Как я могу запретить другим приложениям iOS / Android использовать мой RESTful API? Не удается установить Android ADT 21.1 на eclipse Juno (Windows 7) после обновления до SDK 21.1 Пользовательский макет, который округляет углы его содержимого Как установить пользовательский цвет фона состояния кнопки?