Przewijanie jest podzielone na kilka faz. Zmiana danych wejściowych jest wysyłana przez sekwencję faz, aby każda faza miała możliwość wykorzystania ruchu lub zareagowania na niego.
W trakcie tego cyklu na każdym etapie przekazywane są zarówno dostępne, jak i wykorzystane zmiany danych wejściowych. Dzięki temu każda faza ma pełny kontekst potrzebny do reagowania na zdarzenie przewijania, wykorzystywania go lub nasłuchiwania.
Jak pokazano na rysunku 1, proces przewijania przebiega w następującej kolejności:
- Przewijanie poza zakres: najpierw otrzymuje początkową różnicę danych wejściowych, co daje mu możliwość zareagowania w pierwszej kolejności (np. przez złagodzenie aktywnego efektu rozciągania).
- Przewijanie zagnieżdżone przed przewijaniem: umożliwia reagowanie na zmianę danych wejściowych przed fazą przewijania. W tej fazie może zostać wykorzystana część danych wejściowych lub mogą one być tylko monitorowane w celu wywołania zmian w interfejsie, takich jak zwinięcie lub rozwinięcie paska aplikacji.
- Transform input delta: dostosowuje znak nieprzetworzonej różnicy wejściowej na podstawie orientacji i kierunku układu, aby zapewnić naturalne przewijanie. Więcej informacji znajdziesz w sekcji Przekształcanie delta danych wejściowych.
- Przewijanie: ta faza otrzymuje dostępne, niewykorzystane dane wejściowe delta dostosowane do konfiguracji kontenera przewijania. Zwykle używa tej różnicy do aktualizowania własnego przesunięcia przewijania.
- Przywróć nieprzetworzoną różnicę danych wejściowych: przywraca dostępną i wykorzystaną różnicę z fazy przewijania do pierwotnego znaku nieprzetworzonej różnicy danych wejściowych.
- Przewijanie zagnieżdżone po przewijaniu: ta faza reaguje po zakończeniu głównej fazy przewijania, otrzymując nowo zaktualizowane dostępne i wykorzystane delty. Może wykorzystać pozostałe dostępne dane wejściowe lub użyć kontekstu tego, co właśnie zostało wykorzystane.
- Overscroll: W tej ostatniej fazie sprawdzane są ostatnie dostępne i wykorzystane delty. Wszelkie pozostałe dostępne dane wejściowe, które dotrą do tego etapu, są zwykle używane do wywoływania efektów krawędzi, takich jak rozciągnięcie lub poświata, wskazujących, że użytkownik dotarł do granicy obszaru przewijania.
Przekształć delta wejściową
Zmiana danych wejściowych wskaźnika wymaga dostosowania znaku na różnych etapach przewijania, aby odpowiadała oczekiwanym umowom. Zanim delta osiągnie fazę przewijania, modyfikatory przewijania dostosowują deltę wejściową na podstawie orientacji, kierunku układu i kontekstów RTL. Dzieje się tak, ponieważ nieprzetworzone dane wejściowe śledzą ruch fizycznego piksela wskaźnika na ekranie (np. ruch w dół zwiększa współrzędną Y ekranu, co daje dodatnią deltę). Aby jednak uzyskać „naturalne przewijanie”, w którym treść przesuwa się wraz z palcem, przeciągnięcie w dół oznacza, że widoczny obszar musi przesunąć się w górę nad treścią, co odpowiada ujemnemu przesunięciu przewijania.
Zmiany danych wejściowych z innych źródeł, takich jak kółko myszy lub touchpad, nie są przekształcane podczas faz przewijania.
Przykład: wskaźnik przesuwa się w prawo za pomocą Modifier.horizontalScroll()
Aby dowiedzieć się, jak zmiany są wykorzystywane i przekształcane, zobacz rysunek 2, który przedstawia gest, w którym wskaźnik przesuwa się w prawo.
- Przed przewinięciem: gest rozpoczyna się od dodatniej nieprzetworzonej wartości delta danych wejściowych wynoszącej 100.
- Przewijanie poza zakres wykrywa to i wykorzystuje 10, pozostawiając 90.
- Przewijanie wstępne w ramach przewijania zagnieżdżonego daje komponentowi nadrzędnemu możliwość zareagowania i wykorzystania 30. Pozostała nieprzetworzona różnica wynosi 60.
- Przekształcenie A: przed przejściem do fazy przewijania
horizontalScrollodwraca pozostałą dodatnią nieprzetworzoną deltę (60) na deltę ujemną (-60). Dzięki temu widoczny obszar przesuwa się w lewo, a treść wydaje się przesuwać w prawo wraz z palcem użytkownika. - Przewijanie: docelowy komponent, który można przewijać, wykorzystuje część tej przekształconej wartości delta do aktualizacji przesunięcia przewijania. W tym przykładzie wykorzystuje -30, pozostawiając -30 niewykorzystanych.
- Przekształcenie B: niewykorzystana delta przewijania (-30) jest przekształcana z powrotem w dodatnią nieprzetworzoną deltę (30), aby pasowała do umowy dotyczącej przewijania zagnieżdżonego i overscroll.
- Po przewinięciu: pozostała nieprzetworzona delta jest przekazywana z powrotem do potoku.
- Zagnieżdżone przewijanie po przewinięciu zużywa 10, pozostawiając 20.
- Efekt przewijania poza zakres wykorzystuje ostatnie 20, aby wywołać efekty wizualne krawędzi, takie jak rozciągnięcie lub poświata, co pozwala w pełni rozwiązać problem delta wejściowej do wartości 0.
Dokumentacja przekształcania delta danych wejściowych ze wskaźnika
W tabeli poniżej pokazano, jak zmiany danych wejściowych są podpisywane w różnych fazach i kierunkach w przypadku danych wejściowych ze wskaźnika.
| Nieprzetworzone dane wejściowe delta | Efekt przewijania poza zakres | Zagnieżdżone przewijanie | scrollableArea w orientacji poziomej |
scrollableArea z orientacją poziomą (odwróconą) |
scrollableArea w orientacji pionowej |
scrollableArea z orientacją pionową (odwróconą) |
|
|---|---|---|---|---|---|---|---|
| Wskaźnik przesuwa się W GÓRĘ | Negatywny wynik | Negatywny wynik | Negatywny wynik | Nie dotyczy | Nie dotyczy | Pozytywny wynik | Negatywny wynik |
| Wskaźnik przesuwa się W DÓŁ | Pozytywny wynik | Pozytywny wynik | Pozytywny wynik | Nie dotyczy | Nie dotyczy | Negatywny wynik | Pozytywny wynik |
| Wskaźnik przesuwa się W LEWO | Negatywny wynik | Negatywny wynik | Negatywny wynik | Dodatnia (ujemna w przypadku języków zapisywanych od prawej do lewej) | Ujemna (dodatnia w przypadku języków zapisywanych od prawej do lewej) | Nie dotyczy | Nie dotyczy |
| Wskaźnik przesuwa się w PRAWO | Pozytywny wynik | Pozytywny wynik | Pozytywny wynik | Ujemna (dodatnia w przypadku języków zapisywanych od prawej do lewej) | Dodatnia (ujemna w przypadku języków zapisywanych od prawej do lewej) | Nie dotyczy | Nie dotyczy |