Przenoszenie widoków za pomocą animacji przesuwania

Wypróbuj Compose
Jetpack Compose to zalecany zestaw narzędzi interfejsu na Androida. Dowiedz się, jak używać animacji w Compose.

Animacja oparta na rzucaniu wykorzystuje siłę tarcia proporcjonalną do prędkości obiektu. Użyj go, aby animować właściwość obiektu i stopniowo kończyć animację. Ma początkowy impet, który w większości pochodzi z szybkości gestu, i stopniowo zwalnia. Animacja kończy się, gdy jej prędkość jest wystarczająco mała, aby nie powodować widocznych zmian na ekranie urządzenia.

Rysunek 1. Animacja rzutu

Więcej informacji o powiązanych tematach znajdziesz w tych przewodnikach:

Dodawanie biblioteki AndroidX

Aby używać animacji opartych na fizyce, musisz dodać do projektu bibliotekę AndroidX w ten sposób:

  1. Otwórz plik build.gradle modułu aplikacji.
  2. Dodaj bibliotekę AndroidX do sekcji dependencies.

    Groovy

            dependencies {
                implementation 'androidx.dynamicanimation:dynamicanimation:1.0.0'
            }
            

    Kotlin

            dependencies {
                implementation("androidx.dynamicanimation:dynamicanimation:1.0.0")
            }
            

Tworzenie animacji przesunięcia

Klasa FlingAnimation umożliwia utworzenie animacji przesunięcia obiektu. Aby utworzyć animację przesunięcia, utwórz instancję klasy FlingAnimation i podaj obiekt oraz jego właściwość, którą chcesz animować.

Kotlin

val fling = FlingAnimation(view, DynamicAnimation.SCROLL_X)

Java

FlingAnimation fling = new FlingAnimation(view, DynamicAnimation.SCROLL_X);

Ustawianie prędkości

Prędkość początkowa określa szybkość, z jaką właściwość animacji zmienia się na początku animacji. Domyślna prędkość początkowa jest ustawiona na zero pikseli na sekundę. Dlatego musisz zdefiniować prędkość początkową, aby animacja nie zakończyła się od razu.

Jako prędkość początkową możesz użyć stałej wartości lub określić ją na podstawie prędkości gestu dotykowego. Jeśli zdecydujesz się podać stałą wartość, zdefiniuj ją w jednostkach dp na sekundę, a następnie przelicz na piksele na sekundę. Określenie wartości w dp na sekundę sprawia, że prędkość jest niezależna od gęstości i rodzaju urządzenia. Więcej informacji o przeliczaniu prędkości początkowej na piksele na sekundę znajdziesz w sekcji Przeliczanie dp na sekundę na piksele na sekundę w artykule Animacja sprężynowa.

Aby ustawić prędkość, wywołaj metodę setStartVelocity() i przekaż prędkość w pikselach na sekundę. Metoda zwraca obiekt rzutu, w którym ustawiono prędkość.

Uwaga: użyj klas GestureDetector.OnGestureListenerVelocityTracker, aby odpowiednio pobrać i obliczyć prędkość gestów dotykowych.

Ustawianie zakresu wartości animacji

Jeśli chcesz ograniczyć wartość właściwości do określonego zakresu, możesz ustawić minimalną i maksymalną wartość animacji. Ten zakres jest szczególnie przydatny podczas animowania właściwości, które mają zakres wewnętrzny, np. przezroczystość (od 0 do 1).

Uwaga: gdy wartość animacji przesunięcia osiągnie wartość minimalną lub maksymalną, animacja się zakończy.

Aby ustawić wartości minimalną i maksymalną, wywołaj odpowiednio metody setMinValue()setMaxValue(). Obie metody zwracają obiekt animacji, dla którego ustawiono wartość.

Ustawianie tarcia

Metoda setFriction() pozwala zmienić tarcie animacji. Określa, jak szybko zmniejsza się prędkość w animacji.

Uwaga: jeśli nie ustawisz tarcia na początku animacji, użyje ona domyślnej wartości tarcia 1.

Metoda zwraca obiekt, którego animacja wykorzystuje podaną wartość tarcia.

Kod demonstracyjny

Poniższy przykład ilustruje poziome przesunięcie. Prędkość zarejestrowana przez moduł śledzenia prędkości to velocityX, a granice przewijania są ustawione na 0 i maxScroll. Wartość tarcia wynosi 1,1.

Kotlin

FlingAnimation(view, DynamicAnimation.SCROLL_X).apply {
    setStartVelocity(-velocityX)
    setMinValue(0f)
    setMaxValue(maxScroll)
    friction = 1.1f
    start()
}

Java

FlingAnimation fling = new FlingAnimation(view, DynamicAnimation.SCROLL_X);
fling.setStartVelocity(-velocityX)
        .setMinValue(0)
        .setMaxValue(maxScroll)
        .setFriction(1.1f)
        .start();

Ustaw minimalną widoczną zmianę

Animując właściwość niestandardową, która nie jest zdefiniowana w pikselach, ustaw minimalną zmianę wartości animacji widoczną dla użytkowników. Określa rozsądny próg zakończenia animacji.

Nie musisz wywoływać tej metody podczas animowania DynamicAnimation.ViewProperty, ponieważ minimalna widoczna zmiana jest wyliczana na podstawie właściwości. Na przykład:

  • Domyślna minimalna wartość widocznej zmiany wynosi 1 piksel w przypadku właściwości widoku, takich jak TRANSLATION_X, TRANSLATION_Y, TRANSLATION_Z, SCROLL_XSCROLL_Y.
  • W przypadku animacji, które wykorzystują rotację, np. ROTATION, ROTATION_XROTATION_Y, minimalna widoczna zmiana wynosi MIN_VISIBLE_CHANGE_ROTATION_DEGREES, czyli 1/10 piksela.
  • W przypadku animacji, które używają krycia, minimalna widoczna zmiana wynosi MIN_VISIBLE_CHANGE_ALPHA, czyli 1/256.

Aby ustawić minimalną widoczną zmianę animacji, wywołaj metodę setMinimumVisibleChange() i przekaż jedną ze stałych minimalnej widoczności lub wartość, którą musisz obliczyć dla właściwości niestandardowej. Więcej informacji o obliczaniu tej wartości znajdziesz w sekcji Obliczanie minimalnej wartości widocznej zmiany.

Kotlin

anim.minimumVisibleChange = DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE

Java

anim.setMinimumVisibleChange(DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE);

Uwaga: wartość musisz przekazać tylko wtedy, gdy animujesz właściwość niestandardową, która nie jest zdefiniowana w pikselach.

Obliczanie minimalnej wartości widocznej zmiany

Aby obliczyć minimalną widoczną zmianę wartości właściwości niestandardowej, użyj tego wzoru:

Minimalna widoczna zmiana = Zakres wartości właściwości niestandardowej / Zakres animacji w pikselach

Na przykład właściwość, którą chcesz animować, zmienia się od 0 do 100. Odpowiada to zmianie o 200 pikseli. Zgodnie z tym wzorem minimalna wartość widocznej zmiany wynosi 100 / 200, czyli 0,5 piksela.