Przenoszenie widoków za pomocą animacji przesuwania

Wypróbuj tworzenie wiadomości
Jetpack Compose to zalecany zestaw narzędzi interfejsu na Androida. Dowiedz się, jak korzystać z animacji w edytorze.

Animacja na podstawie rzutu korzysta z siły tarcia, która jest proporcjonalna do prędkości obiektu. Użyj go, aby animować właściwość obiektu i stopniowo zakończyć animację. Ma on początkową prędkość, która jest w większości pobierana z prędkości gestu i stopniowo zwalnia. Animacja kończy się, gdy jej prędkość jest na tyle niska, że nie powoduje żadnych widocznych zmian na ekranie urządzenia.

Rysunek 1. Animacja rzutu

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

Dodawanie biblioteki AndroidX

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

  1. Otwórz plik build.gradle dla 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 tworzenie animacji przesunięcia 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ą dana właściwość animacji zmienia się na początku animacji. Domyślna prędkość początkowa to 0 pikseli na sekundę. Dlatego musisz określić prędkość początkową, aby animacja nie kończyła się od razu.

Jako początkową prędkość możesz użyć stałej wartości lub ustawić ją na podstawie 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ę. Definiowanie wartości w dp na sekundę pozwala na określenie szybkości niezależnie od gęstości i formy urządzenia. Więcej informacji o przekształcaniu początkowej prędkości w piksele na sekundę znajdziesz w sekcji Przekształcanie dp/s w piksele/s w artykule Animacja sprężystości.

Aby ustawić prędkość, wywołaj metodę setStartVelocity() i przekazuj ją w pikselach na sekundę. Metoda zwraca obiekt fling, w którym ustawiona jest prędkość.

Uwaga: klasy GestureDetector.OnGestureListenerVelocityTracker służą odpowiednio do pobierania i obliczania prędkości gestów dotykowych.

Ustaw zakres 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 kontroler zakresu jest szczególnie przydatny, 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ć minimalne i maksymalne wartości, wywołaj odpowiednio metody setMinValue()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 na początku animacji nie ustawisz wartości tarcia, animacja użyje domyślnej wartości 1.

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

Kod demonstracyjny

Przykład poniżej pokazuje przesuwanie w poziomie. Prędkość zarejestrowana przez śledzenie prędkości to velocityX, a zakres przewijania to 0 i maxScroll. 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, która jest widoczna dla użytkowników. Określa ona odpowiedni próg zakończenia animacji.

Nie trzeba wywoływać tej metody podczas animacji DynamicAnimation.ViewProperty, ponieważ minimalna widoczna zmiana jest pobierana 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, które wykorzystują obrót, 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 wykorzystują przezroczystość, minimalna widoczna zmiana to 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 widocznej wartości zmiany

Aby obliczyć minimalną widoczną wartość zmiany 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 wartość właściwości, którą chcesz animować, zmienia się od 0 do 100. Odpowiada to zmianie o 200 pikseli. Zgodnie z formułą minimalna widoczna zmiana wynosi 100 / 200 = 0, 5 piksela.