Za pomocą systemu animacji widoku możesz wykonać animację przejścia w przypadku widoków. Animacja przejścia oblicza animację z informacjami takimi jak punkt początkowy, punkt końcowy, rozmiar, obrót i inne typowe aspekty animacji.
Animacja przejścia może wykonywać na zawartości obiektu View serię prostych przekształceń (pozycja, rozmiar, obrót i przezroczystość). Jeśli masz obiekt TextView
, możesz przesuwać, obracać, powiększać lub zmniejszać tekst. Jeśli zawiera obraz tła, zostanie on przekształcony razem z tekstem. W elementach animation package
znajdują się wszystkie klasy użyte w animacji przejścia.
Sekwencja instrukcji animacji definiuje animację pośrednią zdefiniowaną przez kod XML lub Androida. Podobnie jak w przypadku definiowania układu, zalecamy użycie pliku XML, ponieważ jest on bardziej czytelny, wielokrotnego użytku i wymienny niż animacja na stałe zakodowana na stałe. W przykładzie poniżej używamy kodu XML. (Aby dowiedzieć się więcej o definiowaniu animacji w kodzie aplikacji zamiast w XML, zapoznaj się z klasą AnimationSet
i innymi podklasami Animation
).
Instrukcje animacji określają przekształcenia, które mają nastąpić, czas ich trwania oraz czas ich stosowania. Przekształcenia mogą być sekwencyjne lub równoczesne – na przykład zawartość obiektu TextView może być przesuwana od lewej do prawej, a następnie obracana o 180 stopni. Możliwe też, że tekst może przesuwać się i obracać jednocześnie. Każde przekształcenie wymaga zestawu parametrów właściwych dla tego przekształcenia (np. rozmiar początkowy i końcowy w przypadku zmiany rozmiaru, kąt początkowy i kąt końcowy w przypadku obrotu itd.), a także zestawu wspólnych parametrów (np. czas rozpoczęcia i długość trwania). Aby kilka przekształceń odbywało się jednocześnie, nadaj im ten sam czas rozpoczęcia. Aby były one wykonywane po kolei, oblicz czas rozpoczęcia oraz czas trwania poprzedniej transformacji.
Plik XML animacji należy umieścić w katalogu res/anim/
projektu Android. Plik musi zawierać jeden element główny: może to być element <alpha>
, <scale>
, <translate>
, <rotate>
, element interpolujący lub element <set>
zawierający grupy tych elementów (które mogą zawierać inny element <set>
). Domyślnie wszystkie instrukcje animacji są stosowane jednocześnie. Aby były one wyświetlane sekwencyjnie, musisz określić atrybut startOffset
, jak pokazano w przykładzie poniżej.
Poniższy kod XML z jednego z plików ApiDemos służy do rozciągania, a następnie do jednoczesnego obracania i przekręcania obiektu View.
<set android:shareInterpolator="false"> <scale android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromXScale="1.0" android:toXScale="1.4" android:fromYScale="1.0" android:toYScale="0.6" android:pivotX="50%" android:pivotY="50%" android:fillAfter="false" android:duration="700" /> <set android:interpolator="@android:anim/decelerate_interpolator"> <scale android:fromXScale="1.4" android:toXScale="0.0" android:fromYScale="0.6" android:toYScale="0.0" android:pivotX="50%" android:pivotY="50%" android:startOffset="700" android:duration="400" android:fillBefore="false" /> <rotate android:fromDegrees="0" android:toDegrees="-45" android:toYScale="0.0" android:pivotX="50%" android:pivotY="50%" android:startOffset="700" android:duration="400" /> </set> </set>
Współrzędne ekranu (nieużywane w tym przykładzie) to (0,0) w lewym górnym rogu. Współrzędne te rosną, gdy przesuwasz się w dół i w prawo.
Niektóre wartości, np. pivotX, można określić względem obiektu lub względem jednostki nadrzędnej. Upewnij się, że używasz prawidłowego formatu („50” dla 50% w stosunku do elementu nadrzędnego lub „50%” dla 50% w stosunku do siebie).
Sposób stosowania przekształcenia w czasie możesz określić, przypisując Interpolator
. Android zawiera kilka podklas Interpolator, które określają różne krzywe prędkości: na przykład AccelerateInterpolator
mówi transformacji, aby zaczynała wolno, a potem przyspieszała. Każdy z nich ma wartość atrybutu, którą można zastosować w pliku XML.
Gdy ten plik XML jest zapisany jako hyperspace_jump.xml
w katalogu res/anim/
projektu, poniższy kod będzie się do niego odwoływać i stosować do obiektu ImageView
z szablonu.
Kotlin
AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump).also { hyperspaceJumpAnimation -> findViewById<ImageView>(R.id.spaceshipImage).startAnimation(hyperspaceJumpAnimation) }
Java
ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage); Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump); spaceshipImage.startAnimation(hyperspaceJumpAnimation);
Zamiast startAnimation()
możesz określić czas rozpoczęcia animacji za pomocą
, a następnie przypisać animację do widoku za pomocą Animation.setStartTime()
.View.setAnimation()
Więcej informacji o składni XML, dostępnych tagach i atrybutach znajdziesz w artykule Zasoby animacji.
Uwaga: niezależnie od tego, jak animacja się porusza lub zmienia rozmiar, granice widoku, który ją zawiera, nie będą się automatycznie dostosowywać do niej. Mimo to animacja będzie nadal wyświetlana poza granicami widoku i nie zostanie przycięta. Przycinanie pojawi się, jeśli animacja przekroczy granice widoku nadrzędnego.