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 |