Определяем величину скроллинга для ScrollView и HorizontalScrollView

При работе со скроллингом может возникнуть необходимость узнать насколько пользователь «прокрутил» страницу, галерею и т.п.

Начиная с Android 6.0 (API 23) для ScrollView и HorizontalScrollView появилась возможность легко решить данную задачу.

Речь идёт об обработке события onScrollChange, которое возникает при «прокрутке» ScrollView и HorizontalScrollView. Обработчик данного события имеет следующую сигнатуру.

Параметры scrollX и scrollY, это и есть то «расстояние», на которое пользователь «прокрутил» элемент по горизонтали и по вертикали соответственно.

Ниже показан пример получения величины вертикального скроллинга в ScrollView, в котором её значение выводится на экран в виде всплывающего уведомления (Toast).

Получение величины горизонтального скроллинга для HorizontalScrollView производится аналогично с единственным отличием – вместо scrollY используется scrollX.

При помощи условного оператора, в который помещена обработка события onScrollChange, обеспечивается совместимость с более ранними версиями API, которые не поддерживают его обработку (если Min SDK Version ниже 23), чтобы при работе приложения не возникало исключительных ситуаций.

5 комментариев

  1. А почему в этом случае Toast срабатывает не один раз, а несколько (и довольно много, иногда более десятка) раз?

    1. Такое поведение действительно может наблюдаться, т.к. событие может отрабатывать не один раз. Это известная особенность ScrollView и HorizontalScrollView.

  2. а как сделать, чтобы скролл был на фиксированную величину. Например пролистываем фотографии или кардсвью. Я вбиваю в параметр скролла scrollX — 300dp. Вроде он должен за это отвечать, но ничего не выходит. Нигде информации никакой..

    1. В событии onScrollChange вы это никак не сделаете. Оно отрабатывает уже после скроллинга. scrollX хранит данные уже постфактум и ни на что не влияет.
      Можно попробовать обрабатывать жесты. Но, это низкоуровневый и потому достаточно сложный вариант. Также можно попробовать различные библиотеки для галерей и т.п.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *