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ę AndroidaX 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ę 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.OnGestureListener
i VelocityTracker
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()
i 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
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ę 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.