Przenoszenie widoków za pomocą animacji przesuwania

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

Animacja oparta na przesunięciu wykorzystuje siłę tarcia proporcjonalną do an prędkości obiektu. Użyj jej, aby animować właściwość obiektu i stopniowo kończyć animację. Ma ona początkowy pęd, który jest w większości uzyskiwany z prędkoś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 przesunięcia

Więcej informacji na powiązane tematy znajdziesz w tych przewodnikach:

Dodawanie biblioteki AndroidX

Aby korzystać z 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 przesunięcia

Klasa FlingAnimation umożliwia tworzenie animacji przesunięcia dla 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 oprzeć ją na prędkości gestu dotykowego. Jeśli zdecydujesz się podać stałą wartość, musisz zdefiniować ją w dp na sekundę, a następnie przekonwertować na piksele na sekundę. Zdefiniowanie wartości w dp na sekundę pozwala na to, aby prędkość była niezależna 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ężyny.

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

Uwaga: do pobierania i obliczania prędkości gestów dotykowych używaj odpowiednio klas GestureDetector.OnGestureListener i VelocityTracker.

Ustawianie zakresu wartości animacji

Możesz ustawić minimalną i maksymalną wartość animacji, gdy 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 przesunięcia osiągnie wartość minimalną lub maksymalną, animacja się zakończy.

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

Ustawianie tarcia

Metoda setFriction() umożliwia zmianę tarcia animacji. Określa ona, jak szybko zmniejsza się prędkość w animacji.

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

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

Przykładowy kod

Poniższy przykład ilustruje przesunięcie poziome. Prędkość zarejestrowana przez narzędzie do śledzenia prędkości to 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, musisz ustawić the minimalną zmianę wartości animacji widoczną dla użytkowników. Określa ona rozsądny próg zakończenia animacji.

W przypadku animowania DynamicAnimation.ViewProperty nie trzeba wywoływać tej metody, ponieważ minimalna widoczna zmiana jest wyprowadzana z właściwości. Na przykład:

  • Domyślna minimalna widoczna zmiana 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 używają obrotu, takich jak ROTATION, ROTATION_X, i ROTATION_Y, minimalna widoczna zmiana to MIN_VISIBLE_CHANGE_ROTATION_DEGREES, czyli 1/10 piksela.
  • W przypadku animacji, które używają nieprzezroczystości, minimalna widoczna zmiana to MIN_VISIBLE_CHANGE_ALPHA, czyli 1/256.

Aby ustawić minimalną widoczną zmianę animacji, wywołaj metodę setMinimumVisibleChange() i przekaż jedną ze stałych minimalnej widocznej zmiany 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 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 widocznej zmiany

Aby obliczyć minimalną widoczną zmianę 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 widoczna zmiana wynosi 100 / 200, czyli 0,5 piksela.