Przenoszenie widoków za pomocą animacji przesuwania

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

Animacja oparta na rzucie wykorzystuje siłę tarcia, która jest proporcjonalna do prędkości obiektu. Użyj go, aby animować właściwość obiektu i stopniowo kończyć animację. Ma początkowy pęd, który jest głównie uzyskiwany z szybkości gestu, i stopniowo zwalnia. Animacja kończy się, gdy jej szybkość jest na tyle niska, że nie powoduje widocznych zmian na ekranie urządzenia.

Rysunek 1. Animacja rzutu

Aby dowiedzieć się więcej na powiązane tematy, zapoznaj się z tymi przewodnikami:

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.

    Dynamiczny

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

    Kotlin

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

Tworzenie animacji rzutu

Klasa FlingAnimation umożliwia utworzenie animacji rzutu obiektu. Aby utworzyć animację rzutu, 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);

Ustaw prędkość

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 0 pikseli na sekundę. Dlatego musisz określić prędkość początkową, aby animacja nie zakończyła się od razu.

Możesz użyć stałej wartości jako prędkości początkowej lub oprzeć ją na prędkości gestu dotykowego. Jeśli zdecydujesz się podać stałą wartość, zdefiniuj ją w dp na sekundę, a następnie przelicz na piksele na sekundę. Zdefiniowanie wartości w dp na sekundę pozwala na uniezależnienie szybkości od gęstości i formatu 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ę w artykule Animacja sprężynowa.

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

Uwaga: użyj klas GestureDetector.OnGestureListener i VelocityTracker, aby odpowiednio pobierać i obliczać szybkość gestów dotykowych.

Ustawianie zakresu wartości animacji

Możesz ustawić minimalne i maksymalne wartości animacji, jeśli chcesz ograniczyć wartość właściwości do określonego zakresu. Ta kontrola zakresu jest szczególnie przydatna, gdy animujesz właściwości, które mają zakres wewnętrzny, np. alfa (od 0 do 1).

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

Aby ustawić wartości minimalne i maksymalne, 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, zostanie użyta domyślna wartość 1.

Metoda zwraca obiekt, którego animacja używa podanej przez Ciebie wartości tarcia.

Przykładowy kod

Poniższy przykład ilustruje rzut poziomy. Szybkość zarejestrowana przez moduł śledzenia szybkości wynosi velocityX, a granice przewijania są ustawione na 0 i maxScroll. Tarcie jest ustawione 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();

Ustawianie minimalnej widocznej zmiany

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

Nie trzeba wywoływać tej metody podczas animowania właściwości DynamicAnimation.ViewProperty, ponieważ minimalna widoczna zmiana jest określana na podstawie właściwości. Przykład:

  • Domyślna minimalna wartość widocznej zmiany to 1 piksel w przypadku właściwości widoku takich jak TRANSLATION_X, TRANSLATION_Y, TRANSLATION_Z, SCROLL_X i SCROLL_Y.
  • W przypadku animacji, które wykorzystują obrót, takich jak 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ą krycia, minimalna widoczna zmiana to MIN_VISIBLE_CHANGE_ALPHA lub 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 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ą wartość widocznej zmiany dla 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 ze wzorem minimalna wartość widocznej zmiany to 100 / 200, czyli 0,5 piksela.