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.
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:
- Otwórz plik
build.gradle
dla 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 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.OnGestureListener
i VelocityTracker
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()
i 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
iSCROLL_Y
. - W przypadku animacji, które wykorzystują obrót, takich jak
ROTATION
,ROTATION_X
iROTATION_Y
, minimalna widoczna zmiana toMIN_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.