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