Animacja oparta na przesunięciu wykorzystuje siłę tarcia, która jest proporcjonalna do prędkości obiektu. Służy do animowania właściwości obiektu i stopniowego kończenia animacji. Początkowy pęd pojawia się głównie dzięki szybkości gestu, a potem stopniowo zwalnia. Animacja kończy się, gdy prędkość jest dostatecznie niska, aby żadna zmiana nie była widoczna na ekranie urządzenia.
Aby dowiedzieć się więcej o powiązanych tematach, przeczytaj te przewodniki:
Dodawanie biblioteki AndroidaX
Aby korzystać z animacji opartych na fizyce, musisz dodać do projektu bibliotekę AndroidaX w ten sposób:
- Otwórz plik
build.gradle
modułu aplikacji. - Dodaj bibliotekę AndroidaX do sekcji
dependencies
.Odlotowe
dependencies { implementation 'androidx.dynamicanimation:dynamicanimation:1.0.0' }
Kotlin
dependencies { implementation("androidx.dynamicanimation:dynamicanimation:1.0.0") }
Utwórz animację przelotu
Klasa FlingAnimation
umożliwia utworzenie animacji przesuwania dla 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ą zmienia się właściwość animacji na początku animacji. Domyślna prędkość początkowa jest ustawiona na 0 pikseli na sekundę. Dlatego, aby mieć pewność, że animacja nie zakończy się od razu, musisz zdefiniować prędkość początkową.
Jako prędkości początkowej możesz użyć stałej wartości lub możesz oprzeć ją na 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ę. Określenie wartości w dp na sekundę pozwala określić prędkość niezależnie od gęstości i formatów urządzenia. Więcej informacji o konwertowaniu prędkości początkowej na piksele na sekundę znajdziesz w sekcji Konwertowanie dp na sekundę na piksele na sekundę artykułu Animacja sprężynowa.
Aby ustawić prędkość, wywołaj metodę setStartVelocity()
i przekazuj ją w pikselach na sekundę. Ta metoda zwraca obiekt fling, dla którego ustawiono prędkość.
Uwaga: aby pobrać i obliczyć prędkość gestów dotykowych, użyj klas GestureDetector.OnGestureListener
i VelocityTracker
.
Ustaw zakres wartości animacji
Możesz ustawić minimalne i maksymalne wartości animacji, by ograniczyć wartość właściwości do określonego zakresu. To ustawienie zakresu jest szczególnie przydatne podczas animowania właściwości o wewnętrznym zakresie, na przykład alfa (od 0 do 1).
Uwaga: gdy wartość animacji przesunięcia osiągnie wartość minimalną lub maksymalną, animacja się zakończy.
Aby ustawić wartość minimalną i maksymalną, 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 nie ustawisz tarcia na początku animacji, animacja będzie używać domyślnej wartości tarcia wynoszącej 1.
Ta metoda zwraca obiekt, którego animacja wykorzystuje podaną przez Ciebie wartość tarcia.
Kod demonstracyjny
Przykład poniżej pokazuje przesuwanie w poziomie. Prędkość przechwycona przez moduł śledzenia prędkości wynosi velocityX
, a granice przewijania są ustawione na 0 i maxPrzewiń. 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 widoczną dla użytkowników. Określa rozsądny próg zakończenia animacji.
Nie musisz wywoływać tej metody podczas animowania obiektu DynamicAnimation.ViewProperty
, ponieważ minimalna widoczna zmiana pochodzi 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 wykorzystujących obrót, 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ą przezroczystości, minimalna widoczna zmiana wynosi
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 wartości widocznej zmiany
Aby obliczyć minimalną widoczną wartość zmiany w przypadku usługi niestandardowej, użyj tej formuły:
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 formułą minimalna widoczna wartość zmiany wynosi 100 / 200 to 0, 5 piksela.