Animacja oparta na rzucie wykorzystuje siłę tarcia, która jest proporcjonalna do prędkości obiektu. Użyj go, aby animować właściwość obiektu i stopniowo kończyć animację. Ma początkowy pęd, który jest głównie uzyskiwany z szybkości gestu, i stopniowo zwalnia. Animacja kończy się, gdy jej szybkość jest na tyle niska, że nie powoduje widocznych zmian na ekranie urządzenia.
Aby dowiedzieć się więcej na powiązane tematy, zapoznaj się z tymi przewodnikami:
Dodawanie biblioteki AndroidX
Aby używać animacji opartych na fizyce, musisz dodać do projektu bibliotekę AndroidX w ten sposób:
- Otwórz plik
build.gradlemodułu aplikacji. - Dodaj bibliotekę AndroidX do sekcji
dependencies.Dynamiczny
dependencies { implementation 'androidx.dynamicanimation:dynamicanimation:1.0.0' }
Kotlin
dependencies { implementation("androidx.dynamicanimation:dynamicanimation:1.0.0") }
Tworzenie animacji rzutu
Klasa FlingAnimation umożliwia utworzenie animacji rzutu 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ą właściwość animacji zmienia się na początku animacji. Domyślna prędkość początkowa jest ustawiona na 0 pikseli na sekundę. Dlatego musisz określić prędkość początkową, aby animacja nie zakończyła się od razu.
Możesz użyć stałej wartości jako prędkości początkowej lub oprzeć ją na prędkości gestu dotykowego. Jeśli zdecydujesz się podać stałą wartość, zdefiniuj ją w dp na sekundę, a następnie przelicz na piksele na sekundę. Zdefiniowanie wartości w dp na sekundę pozwala na uniezależnienie szybkości od gęstości i formatu 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ę w artykule Animacja sprężynowa.
Aby ustawić prędkość, wywołaj metodę setStartVelocity() i podaj prędkość w pikselach na sekundę. Metoda zwraca obiekt rzutu, dla którego ustawiono prędkość.
Uwaga: użyj klas GestureDetector.OnGestureListener i VelocityTracker, aby odpowiednio pobierać i obliczać szybkość gestów dotykowych.
Ustawianie zakresu wartości animacji
Możesz ustawić minimalne i maksymalne wartości animacji, jeśli chcesz ograniczyć wartość właściwości do określonego zakresu. Ta kontrola zakresu jest szczególnie przydatna, 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ć wartości minimalne i maksymalne, 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, zostanie użyta domyślna wartość 1.
Metoda zwraca obiekt, którego animacja używa podanej przez Ciebie wartości tarcia.
Przykładowy kod
Poniższy przykład ilustruje rzut poziomy. Szybkość zarejestrowana przez moduł śledzenia szybkości wynosi velocityX, a granice przewijania są ustawione na 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();
Ustawianie minimalnej widocznej zmiany
Gdy 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 rozsądny próg zakończenia animacji.
Nie trzeba wywoływać tej metody podczas animowania właściwości DynamicAnimation.ViewProperty, ponieważ minimalna widoczna zmiana jest określana na podstawie właściwości. Przykład:
- Domyślna minimalna wartość widocznej zmiany to 1 piksel w przypadku właściwości widoku takich jak
TRANSLATION_X,TRANSLATION_Y,TRANSLATION_Z,SCROLL_XiSCROLL_Y. - W przypadku animacji, które wykorzystują obrót, takich jak
ROTATION,ROTATION_XiROTATION_Y, minimalna widoczna zmiana wynosiMIN_VISIBLE_CHANGE_ROTATION_DEGREES, czyli 1/10 piksela. - W przypadku animacji, które używają krycia, minimalna widoczna zmiana to
MIN_VISIBLE_CHANGE_ALPHAlub 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 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ą wartość widocznej zmiany dla 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 ze wzorem minimalna wartość widocznej zmiany to 100 / 200, czyli 0,5 piksela.