Omówienie faz przewijania

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.

Diagram cyklu przewijania przedstawiający fazy przewijania w zdarzeniu przewijania przez użytkownika
Rysunek 1. Diagram cyklu przewijania przedstawiający fazy przewijania zdarzenia przewijania użytkownika.

Jak widać na rysunku 1, proces przewijania przebiega w tej kolejności:

  1. 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).
  2. 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.
  3. 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.
  4. 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.
  5. Przywróć pierwotną wartość delta: przywraca dostępną i wykorzystaną wartość delta z fazy przewijania do pierwotnego znaku pierwotnej wartości delta.
  6. 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.
  7. 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()

Wykres przedstawiający gest, w którym wskaźnik przesuwa się w prawo.
Rysunek 2. Wykres przedstawiający gest, w którym wskaźnik przesuwa się w prawo.

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 horizontalScroll odwraca 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