При работе со скроллингом может возникнуть необходимость узнать насколько пользователь «прокрутил» страницу, галерею и т.п.
Начиная с Android 6.0 (API 23) для ScrollView и HorizontalScrollView появилась возможность легко решить данную задачу.
Речь идёт об обработке события onScrollChange, которое возникает при «прокрутке» ScrollView и HorizontalScrollView. Обработчик данного события имеет следующую сигнатуру.
1 |
public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) |
Параметры scrollX и scrollY, это и есть то «расстояние», на которое пользователь «прокрутил» элемент по горизонтали и по вертикали соответственно.
Ниже показан пример получения величины вертикального скроллинга в ScrollView, в котором её значение выводится на экран в виде всплывающего уведомления (Toast).
1 2 3 4 5 6 7 8 9 |
scroll=(ScrollView)findViewById(R.id.scroll); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { scroll.setOnScrollChangeListener(new View.OnScrollChangeListener() { @Override public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { Toast.makeText(getApplicationContext(),String.valueOf(scrollY),Toast.LENGTH_SHORT).show(); } }); } |
Получение величины горизонтального скроллинга для HorizontalScrollView производится аналогично с единственным отличием – вместо scrollY используется scrollX.
При помощи условного оператора, в который помещена обработка события onScrollChange, обеспечивается совместимость с более ранними версиями API, которые не поддерживают его обработку (если Min SDK Version ниже 23), чтобы при работе приложения не возникало исключительных ситуаций.
А почему в этом случае Toast срабатывает не один раз, а несколько (и довольно много, иногда более десятка) раз?
Такое поведение действительно может наблюдаться, т.к. событие может отрабатывать не один раз. Это известная особенность ScrollView и HorizontalScrollView.
а как сделать, чтобы скролл был на фиксированную величину. Например пролистываем фотографии или кардсвью. Я вбиваю в параметр скролла scrollX — 300dp. Вроде он должен за это отвечать, но ничего не выходит. Нигде информации никакой..
В событии onScrollChange вы это никак не сделаете. Оно отрабатывает уже после скроллинга. scrollX хранит данные уже постфактум и ни на что не влияет. Можно попробовать обрабатывать жесты. Но, это низкоуровневый и потому достаточно сложный вариант. Также можно попробовать различные библиотеки для галерей и т.п.
спасибо за ответ