Przenoszenie widoków za pomocą animacji przesuwania

Wypróbuj sposób tworzenia wiadomości
Jetpack Compose to zalecany zestaw narzędzi UI na Androida. Dowiedz się, jak korzystać z animacji w Compose

Animacja oparta na przesunięciu wykorzystuje siłę tarcia, która jest proporcjonalna do prędkości obiektu. Służy do animowania właściwości obiektu i stopniowego kończenia animacji. Początkowy pęd pojawia się głównie dzięki szybkości gestu, a potem stopniowo zwalnia. Animacja kończy się, gdy prędkość jest dostatecznie niska, aby żadna zmiana nie była widoczna na ekranie urządzenia.

Rysunek 1. Animacja przesunięcia

Aby dowiedzieć się więcej o powiązanych tematach, przeczytaj te przewodniki:

Dodawanie biblioteki AndroidaX

Aby korzystać z animacji opartych na fizyce, musisz dodać do projektu bibliotekę AndroidaX w ten sposób:

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

    Odlotowe

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

    Kotlin

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

Utwórz animację przelotu

Klasa FlingAnimation umożliwia utworzenie animacji przesuwania dla obiektu. Aby utworzyć animację przelotu, utwórz instancję klasy FlingAnimation i podaj obiekt oraz właściwość obiektu, które chcesz animować.

Kotlin

val fling = FlingAnimation(view, DynamicAnimation.SCROLL_X)

Java

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

Ustaw prędkość

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

Jako prędkości początkowej możesz użyć stałej wartości lub możesz oprzeć ją na prędkości gestu dotykowego. Jeśli chcesz podać stałą wartość, określ ją w dp na sekundę, a potem przekonwertuj ją na piksele na sekundę. Określenie wartości w dp na sekundę pozwala określić prędkość niezależnie od gęstości i formatów urządzenia. Więcej informacji o konwertowaniu prędkości początkowej na piksele na sekundę znajdziesz w sekcji Konwertowanie dp na sekundę na piksele na sekundę artykułu Animacja sprężynowa.

Aby ustawić prędkość, wywołaj metodę setStartVelocity() i przekazuj ją w pikselach na sekundę. Ta metoda zwraca obiekt fling, dla którego ustawiono prędkość.

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

Ustaw zakres wartości animacji

Możesz ustawić minimalne i maksymalne wartości animacji, by ograniczyć wartość właściwości do określonego zakresu. To ustawienie zakresu jest szczególnie przydatne podczas animowania właściwości o wewnętrznym zakresie, na przykład alfa (od 0 do 1).

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

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

Ustaw tarcie

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, animacja będzie używać domyślnej wartości tarcia wynoszącej 1.

Ta metoda zwraca obiekt, którego animacja wykorzystuje podaną przez Ciebie wartość tarcia.

Kod demonstracyjny

Przykład poniżej pokazuje przesuwanie w poziomie. Prędkość przechwycona przez moduł śledzenia prędkości wynosi velocityX, a granice przewijania są ustawione na 0 i maxPrzewiń. Tarcza jest ustawiona na 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ę

Jeśli animujesz 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 obiektu DynamicAnimation.ViewProperty, ponieważ minimalna widoczna zmiana pochodzi z właściwości. Na przykład:

  • Domyślna minimalna widoczna wartość zmiany to 1 piksel we właściwościach widoku, np. TRANSLATION_X, TRANSLATION_Y, TRANSLATION_Z, SCROLL_X i SCROLL_Y.
  • W przypadku animacji wykorzystujących obrót, np. ROTATION, ROTATION_X i ROTATION_Y, minimalna widoczna zmiana wynosi MIN_VISIBLE_CHANGE_ROTATION_DEGREES, czyli 1/10 piksela.
  • W przypadku animacji, które używają przezroczystości, minimalna widoczna zmiana wynosi MIN_VISIBLE_CHANGE_ALPHA, czyli 1/256.

Aby ustawić minimalną widoczną zmianę animacji, wywołaj metodę setMinimumVisibleChange() i przekaż jedną z minimalnych widocznych stałych 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 widocznej wartości zmiany.

Kotlin

anim.minimumVisibleChange = DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE

Java

anim.setMinimumVisibleChange(DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE);

Uwaga: wartość musisz przekazywać 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ą wartość zmiany w przypadku usługi niestandardowej, użyj tej formuły:

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 formułą minimalna widoczna wartość zmiany wynosi 100 / 200 to 0, 5 piksela.