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

Как показано на рисунке 1, процесс прокрутки происходит в точно таком порядке:
- Перепрокрутка: Сначала получает начальный входной дельта-сигнал, что дает перепрокрутке возможность отреагировать первой (например, ослабив активный эффект растяжения).
- Вложенная предварительная прокрутка: дает возможность реагировать на изменение входных данных до фазы прокрутки . На этом этапе может быть обработано некоторое изменение входных данных, или же оно может просто отслеживаться для запуска изменений пользовательского интерфейса, таких как сворачивание или разворачивание панели приложения.
- Transform input delta : Изменяет знак исходного входного значения в зависимости от ориентации и направления макета для обеспечения естественного поведения при прокрутке. Для получения дополнительной информации см. раздел Transform input delta .
- Прокрутка: На этом этапе получается доступная, неиспользованная входная дельта, скорректированная в соответствии с конфигурацией контейнера прокрутки. Обычно эта дельта используется для обновления собственного смещения прокрутки.
- Возврат к исходному значению дельты на входе : возвращает доступную и потребленную дельту из фазы прокрутки к исходному значению дельты на входе.
- Вложенная прокрутка после основной прокрутки: этот этап реагирует после завершения основной фазы прокрутки, получая обновленные доступные и обработанные изменения. Он может обрабатывать любые оставшиеся доступные входные данные или использовать контекст только что обработанных данных.
- Перепрокрутка: На этом последнем этапе анализируются оставшиеся доступные и использованные дельты. Любой оставшийся доступный ввод, достигший этой стадии, обычно используется для управления краевыми эффектами, такими как растяжение или свечение, указывая на то, что пользователь достиг границы прокручиваемой области.
Преобразование входной дельты
Для корректного отображения дельты ввода указателя на разных этапах прокрутки требуется корректировка знака в соответствии с ожидаемыми контрактами. До достижения этапа прокрутки модификаторы прокрутки корректируют дельту ввода в зависимости от ориентации, направления макета и контекста RTL. Это происходит потому, что исходный ввод отслеживает физическое перемещение указателя по пикселям на экране (например, перемещение вниз увеличивает Y-координату экрана, что приводит к положительной дельте). Однако для достижения «естественной прокрутки», когда контент перемещается вместе с пальцем, перетаскивание вниз означает, что область просмотра должна сместиться вверх над контентом, что соответствует отрицательному смещению прокрутки.
Изменения входных данных от других источников ввода, таких как колесико мыши или сенсорная панель, не преобразуются на протяжении всех фаз прокрутки.
Пример: перемещение указателя вправо с помощью Modifier.horizontalScroll()

Чтобы понять, как обрабатываются и преобразуются дельты, см. рисунок 2, на котором показан жест, при котором указатель перемещается вправо .
- Предварительная прокрутка: Жест начинается с положительной разницы исходных данных, равной 100 .
- Функция Overscroll отслеживает это и потребляет 10 , оставляя 90 .
- Вложенная предварительная прокрутка дает родительскому компоненту возможность отреагировать, затрачивая 30 секунд . Оставшаяся необработанная дельта составляет 60 секунд .
- Преобразование A : Перед переходом к фазе прокрутки
horizontalScrollинвертирует оставшееся положительное исходное значение delta ( 60 ) в отрицательное значение delta ( -60 ). Это гарантирует, что область просмотра сместится влево, так что контент будет казаться перемещающимся вправо вместе с пальцем пользователя. - Прокрутка: Целевой прокручиваемый компонент использует часть преобразованного дельта-значения для обновления смещения прокрутки. В этом примере он использует -30 , оставляя -30 неиспользованным.
- Преобразование B: Неиспользованная дельта прокрутки (-30) преобразуется обратно в положительную исходную дельту (30), чтобы соответствовать контракту вложенной прокрутки и перепрокрутки.
- После прокрутки: оставшаяся необработанная дельта-данная передается обратно вверх по конвейеру.
- Вложенная прокрутка после основной прокрутки занимает 10 , оставляя 20 .
- Эффект перепрокрутки использует последние 20 для управления визуальными эффектами краев, такими как растяжение или свечение, полностью обнуляя входную дельту.
Ссылка на дельта-преобразование входного указателя
В следующей таблице показано, как определяются знаки изменений входных данных на разных этапах и в разных направлениях для ввода указателя.
| Необработанный входной дельта | эффект перепрокрутки | Вложенная прокрутка | scrollableArea с горизонтальной ориентацией | scrollableArea с горизонтальной ориентацией (обратная ориентация) | scrollableArea с вертикальной ориентацией | scrollableArea с вертикальной ориентацией (обратная ориентация) | |
|---|---|---|---|---|---|---|---|
| Указатель движется ВВЕРХ | Отрицательный | Отрицательный | Отрицательный | Н/Д | Н/Д | Положительный | Отрицательный |
| Указатель движется ВНИЗ | Положительный | Положительный | Положительный | Н/Д | Н/Д | Отрицательный | Положительный |
| Указатель перемещается влево. | Отрицательный | Отрицательный | Отрицательный | Положительный результат (отрицательный результат для RTL) | Отрицательный результат (положительный результат для RTL) | Н/Д | Н/Д |
| Указатель движется ВПРАВО | Положительный | Положительный | Положительный | Отрицательный результат (положительный результат для RTL) | Положительный результат (отрицательный результат для RTL) | Н/Д | Н/Д |