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ę AndroidX 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ę 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ą 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 zdecydujesz się podać stałą wartość, musisz ją zdefiniować w dp na sekundę, a potem przekonwertować 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 na piksele na sekundę znajdziesz w sekcji Przekształcanie dp na sekundę na piksele na sekundę w artykule Animacja sprężystości.

Aby ustawić prędkość, wywołaj metodę setStartVelocity(), podając prędkość 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.

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 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 prędkość maleje w ramach 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 rzut poziomy. Prędkość zarejestrowana przez śledzenie prędkości to velocityX, a zakres przewijania ma wartość 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();

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. Może to obejmować np. te funkcje:

  • Domyślna minimalna widoczna wartość 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 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ę w animacji, wywołaj metodę setMinimumVisibleChange() i przekaż jedną z konstant 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 wartości widocznej zmiany.

Kotlin

anim.minimumVisibleChange = DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE

Java

anim.setMinimumVisibleChange(DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE);

Uwaga: wartość musisz podać 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.