Przewijanie jest podzielone na kilka etapów. 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, korzystania z niego lub nasłuchiwania go.
Jak pokazano 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ę danych wejściowych: dostosowuje znak surowej delty danych wejściowych 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 danych wejściowych: przywraca dostępną i wykorzystaną wartość delta z fazy przewijania do pierwotnego znaku wartości delta danych wejściowych.
- 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 kontekst tego, co zostało właśnie wykorzystane.
- Przewijanie poza zakres: 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 w 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ą fizyczne ruchy 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 widocznego obszaru 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ść delta to 60.
- Przekształcenie A: przed wejściem w fazę przewijania
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 zużywa ona -30, pozostawiając -30 niezużytych.
- Przekształcenie B: nieużyta wartość delta przewijania (-30) jest przekształcana z powrotem w dodatnią wartość delta (30), aby pasowała do umowy dotyczącej zagnieżdżonego przewijania i przewijania poza zakres.
- Po przewinięciu: pozostała część surowej wartości 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 krawędź wykorzystuje ostatnie 20 jednostek do wywołania efektów wizualnych na krawędziach, takich jak rozciągnięcie lub poświata, w pełni rozwiązując deltę wejściową do wartości 0.
Dokumentacja przekształcania różnicy danych wejściowych wskaźnika
W tabeli poniżej przedstawiono sposób podpisywania różnic 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 języków zapisywanych od prawej do lewej) | 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 |