Animacja oparta na rzucaniu wykorzystuje siłę tarcia proporcjonalną do prędkości obiektu. Użyj go, aby animować właściwość obiektu i stopniowo kończyć animację. Ma początkowy impet, który w większości pochodzi z szybkoś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.

Więcej informacji o powiązanych tematach znajdziesz w tych przewodnikach:
Dodawanie biblioteki AndroidX
Aby używać animacji opartych na fizyce, musisz dodać do projektu bibliotekę AndroidX w ten sposób:
- Otwórz plik
build.gradle
modułu aplikacji. - 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 utworzenie animacji przesunięcia 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 określić ją na podstawie prędkości gestu dotykowego. Jeśli zdecydujesz się podać stałą wartość, zdefiniuj ją w jednostkach dp na sekundę, a następnie przelicz na piksele na sekundę. Określenie wartości w dp na sekundę sprawia, że prędkość jest niezależna od gęstości i rodzaju urządzenia. Więcej informacji o przeliczaniu prędkości początkowej na piksele na sekundę znajdziesz w sekcji Przeliczanie dp na sekundę na piksele na sekundę w artykule Animacja sprężynowa.
Aby ustawić prędkość, wywołaj metodę setStartVelocity()
i przekaż prędkość w pikselach na sekundę. Metoda zwraca obiekt rzutu, w którym ustawiono prędkość.
Uwaga: użyj klas GestureDetector.OnGestureListener
i VelocityTracker
, aby odpowiednio pobrać i obliczyć prędkość 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 zakres jest szczególnie przydatny podczas animowania właściwości, które mają zakres wewnętrzny, np. przezroczystość (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()
pozwala zmienić tarcie animacji. Określa, jak szybko zmniejsza się prędkość w animacji.
Uwaga: jeśli nie ustawisz tarcia na początku animacji, użyje ona domyślnej wartości tarcia 1.
Metoda zwraca obiekt, którego animacja wykorzystuje podaną wartość tarcia.
Kod demonstracyjny
Poniższy przykład ilustruje poziome przesunięcie. Prędkość zarejestrowana przez moduł śledzenia prędkości to velocityX
, a granice przewijania są ustawione na 0 i maxScroll. Wartość tarcia wynosi 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ę
Animując 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 DynamicAnimation.ViewProperty
, ponieważ minimalna widoczna zmiana jest wyliczana na podstawie właściwości. Na przykład:
- Domyślna minimalna wartość widocznej zmiany wynosi 1 piksel w przypadku właściwości widoku, takich jak
TRANSLATION_X
,TRANSLATION_Y
,TRANSLATION_Z
,SCROLL_X
iSCROLL_Y
. - W przypadku animacji, które wykorzystują rotację, np.
ROTATION
,ROTATION_X
iROTATION_Y
, minimalna widoczna zmiana wynosiMIN_VISIBLE_CHANGE_ROTATION_DEGREES
, czyli 1/10 piksela. - W przypadku animacji, które używają krycia, minimalna widoczna zmiana wynosi
MIN_VISIBLE_CHANGE_ALPHA
, czyli 1/256.
Aby ustawić minimalną widoczną zmianę animacji, wywołaj metodę setMinimumVisibleChange()
i przekaż jedną ze stałych minimalnej widoczności 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 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ą widoczną zmianę wartości 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 z tym wzorem minimalna wartość widocznej zmiany wynosi 100 / 200, czyli 0,5 piksela.