Animacja oparta na przesunięciu wykorzystuje siłę tarcia proporcjonalną do an prędkości obiektu. Użyj jej, aby animować właściwość obiektu i stopniowo kończyć animację. Ma ona początkowy pęd, który jest w większości uzyskiwany z prędkoś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 na powiązane tematy znajdziesz w tych przewodnikach:
Dodawanie biblioteki AndroidX
Aby korzystać z 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 przesunięcia
Klasa FlingAnimation umożliwia tworzenie
animacji przesunięcia dla 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 oprzeć ją na prędkości gestu dotykowego. Jeśli zdecydujesz się podać stałą wartość, musisz zdefiniować ją w dp na sekundę, a następnie przekonwertować na piksele na sekundę. Zdefiniowanie wartości w dp na sekundę pozwala na to, aby prędkość była niezależna 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ężyny.
Aby ustawić prędkość, wywołaj metodę setStartVelocity() i przekaż
prędkość w pikselach na sekundę. Metoda zwraca obiekt przesunięcia, dla którego ustawiono prędkość.
Uwaga: do pobierania i obliczania prędkości gestów dotykowych używaj odpowiednio klas
GestureDetector.OnGestureListener i
VelocityTracker.
Ustawianie zakresu wartości animacji
Możesz ustawić minimalną i maksymalną wartość animacji, gdy 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 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() umożliwia zmianę tarcia animacji. Określa ona, jak szybko zmniejsza się prędkość w animacji.
Uwaga: jeśli nie ustawisz tarcia na początku animacji, animacja użyje domyślnej wartości tarcia równej 1.
Metoda zwraca obiekt, którego animacja używa podanej wartości tarcia.
Przykładowy kod
Poniższy przykład ilustruje przesunięcie poziome. Prędkość zarejestrowana przez narzędzie do śledzenia prędkości to 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, musisz ustawić the minimalną zmianę wartości animacji widoczną dla użytkowników. Określa ona rozsądny próg zakończenia animacji.
W przypadku animowania
DynamicAnimation.ViewProperty nie trzeba wywoływać tej metody, ponieważ
minimalna widoczna zmiana jest wyprowadzana z właściwości. Na przykład:
- Domyślna minimalna widoczna zmiana 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 używają obrotu, takich jak
ROTATION,ROTATION_X, iROTATION_Y, minimalna widoczna zmiana toMIN_VISIBLE_CHANGE_ROTATION_DEGREES, czyli 1/10 piksela. - W przypadku animacji, które używają nieprzezroczystości, minimalna widoczna zmiana to
MIN_VISIBLE_CHANGE_ALPHA, czyli 1/256.
Aby ustawić minimalną widoczną zmianę animacji, wywołaj metodę
setMinimumVisibleChange() i przekaż jedną ze stałych 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 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 widocznej zmiany
Aby obliczyć minimalną widoczną zmianę 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 widoczna zmiana wynosi 100 / 200, czyli 0,5 piksela.