Przewijanie jest podzielone na kilka faz. Zmiana danych wejściowych jest wysyłana w sekwencji faz, aby każda z nich miała możliwość wykorzystania ruchu lub zareagowania na niego.
W trakcie tego cyklu na każdym etapie przekazywane są zarówno dostępne dane wejściowe, jak i wykorzystane dane wejściowe. Dzięki temu każda faza ma pełny kontekst potrzebny do reagowania na zdarzenie przewijania, jego wykorzystywania lub nasłuchiwania.
Jak widać na rysunku 1, proces przewijania przebiega w tej kolejności:
- Przewijanie poza zakres: najpierw otrzymuje początkową różnicę danych wejściowych, co daje możliwość zareagowania (np. przez złagodzenie aktywnego efektu rozciągania).
- Wstępne przewijanie zagnieżdżone: umożliwia reagowanie na dane wejściowe przed fazą przewijania. W tej fazie może zostać wykorzystana część różnicy danych wejściowych lub może ona być tylko monitorowana w celu wywołania zmian w interfejsie, np. zwinięcia lub rozwinięcia paska aplikacji.
- Przekształć deltę wejściową: dostosowuje znak surowej delty wejściowej na podstawie orientacji i kierunku układu, aby zapewnić naturalne przewijanie. Więcej informacji znajdziesz w sekcji Przekształcanie danych wejściowych delta.
- Przewijanie: w tej fazie otrzymywane są dostępne, niewykorzystane dane wejściowe delta dostosowane do konfiguracji kontenera przewijania. Zwykle używa tej wartości delta do aktualizowania własnego przesunięcia przewijania.
- Przywróć pierwotną wartość delta: przywraca dostępną i wykorzystaną wartość delta z fazy przewijania do pierwotnego znaku pierwotnej wartości delta.
- Przewijanie zagnieżdżone po przewinięciu: 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 zostało właśnie wykorzystane.
- Przewijanie poza krawędź: w tej ostatniej fazie sprawdzane są ostateczne dostępne i wykorzystane delty. Wszelkie pozostałe dostępne dane wejściowe, które docierają do tego etapu, są zwykle używane do wywoływania efektów krawędziowych, takich jak rozciąganie lub świecenie, wskazujących, że użytkownik dotarł do granicy obszaru przewijania.
Przekształć dane wejściowe delta
Różnica danych wejściowych wskaźnika wymaga dostosowania znaku w różnych fazach przewijania, aby pasowała do oczekiwanych umów. Zanim delta osiągnie fazę Scroll, modyfikatory przewijania dostosowują deltę wejściową na podstawie orientacji, kierunku układu i kontekstów RTL. Dzieje się tak, ponieważ surowe dane wejściowe śledzą fizyczny ruch pikseli wskaźnika na ekranie (np. ruch w dół zwiększa współrzędną Y ekranu, co daje dodatnią wartość delta). Aby jednak uzyskać „naturalne przewijanie”, w którym treści przesuwają się wraz z palcem, przeciągnięcie w dół musi spowodować przesunięcie obszaru widoku 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 w trakcie faz przewijania.
Przykład: wskaźnik przesuwa się w prawo za pomocą funkcji Modifier.horizontalScroll()
Aby dowiedzieć się, jak są wykorzystywane i przekształcane zmiany, zapoznaj się z rysunkiem 2, który przedstawia gest, w którym wskaźnik przesuwa się w prawo.
- Przed przewijaniem: gest rozpoczyna się od dodatniej wartości delta surowego sygnału wejściowego wynoszącej 100.
- Overscroll to zauważa i zużywa 10, pozostawiając 90.
- Nested scroll pre-scroll daje komponentowi nadrzędnemu możliwość zareagowania i wykorzystania 30. Pozostała wartość surowej delty to 60.
- Przekształcenie A: przed wejściem w fazę przewijania funkcja
horizontalScrollodwraca pozostałą dodatnią wartość delta (60) na ujemną wartość delta (–60). Dzięki temu obszar widoku przesunie się w lewo, a treści będą się przesuwać w prawo wraz z palcem użytkownika. - Przewijanie: docelowy komponent z możliwością przewijania wykorzystuje część przekształconej wartości delta, aby zaktualizować przesunięcie przewijania. W tym przykładzie wykorzystuje ona -30, a -30 pozostaje niewykorzystane.
- Przekształcenie B: nieużyta wartość delta przewijania (-30) jest przekształcana z powrotem w dodatnią wartość delta (30), aby była zgodna z umową dotyczącą zagnieżdżonego przewijania i przewijania poza zakres.
- Po przewinięciu: pozostała nieprzetworzona wartość delta jest przekazywana z powrotem w górę potoku.
- Przewijanie zagnieżdżone po przewinięciu zużywa 10, co daje 20.
- Efekt przewijania poza zakres wykorzystuje ostatnie 20 jednostek, aby wywołać wizualne efekty krawędzi, takie jak rozciągnięcie lub poświata, w pełni rozwiązując deltę wejściową do 0.
Dokumentacja przekształcania różnicy danych wejściowych wskaźnika
W tabeli poniżej przedstawiono sposób oznaczania różnic w danych wejściowych w różnych fazach i kierunkach danych wejściowych wskaźnika.
| Nieprzetworzona wartość delta danych wejściowych | Efekt przewijania | Zagnieżdżone przewijanie | scrollableArea w orientacji poziomej |
scrollableArea w orientacji poziomej (odwrócony), |
scrollableArea w orientacji pionowej |
scrollableArea w orientacji pionowej (odwrócony) |
|
|---|---|---|---|---|---|---|---|
| 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) | Ujemne (dodatnie w przypadku RTL) | Nie dotyczy | Nie dotyczy |
| Wskaźnik przesuwa się w PRAWO. | Pozytywny wynik | Pozytywny wynik | Pozytywny wynik | Ujemne (dodatnie 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 |