Zasoby animacji

Zasób animacji może definiować jeden z dwóch typów animacji:

Animacja właściwości
Tworzy animację przez zmianę wartości właściwości obiektu w ustalonym okresie za pomocą Animator.
Wyświetl animację

Istnieją 2 rodzaje animacji dostępne w ramach platformy wyświetlania animacji:

Animacja właściwości

Animacja zdefiniowana w pliku XML, która w ustalonym czasie zmienia właściwości obiektu docelowego, takie jak kolor tła lub wartość alfa.

lokalizacja pliku:
res/animator/filename.xml
Jako identyfikator zasobu jest używana nazwa pliku.
typ danych skompilowanych zasobów:
Wskaźnik zasobu do ValueAnimator, ObjectAnimator lub AnimatorSet
odniesienie do zasobów:
W kodzie opartym na Javie lub Kotlin: R.animator.filename
W formacie XML: @[package:]animator/filename
składnia:
<set
  android:ordering=["together" | "sequentially"]>

    <objectAnimator
        android:propertyName="string"
        android:duration="int"
        android:valueFrom="float | int | color"
        android:valueTo="float | int | color"
        android:startOffset="int"
        android:repeatCount="int"
        android:repeatMode=["restart" | "reverse"]
        android:valueType=["intType" | "floatType"]/>

    <animator
        android:duration="int"
        android:valueFrom="float | int | color"
        android:valueTo="float | int | color"
        android:startOffset="int"
        android:repeatCount="int"
        android:repeatMode=["restart" | "reverse"]
        android:valueType=["intType" | "floatType"]/>

    <set>
        ...
    </set>
</set>

Plik musi zawierać 1 element główny: <set>, <objectAnimator> lub <valueAnimator>. Elementy animacji możesz grupować razem w elemencie <set>, m.in. w innych elementach <set>.

elementy:
<set>
Kontener zawierający inne elementy animacji (<objectAnimator>, <valueAnimator> lub inne elementy <set>). Reprezentuje obiekt AnimatorSet.

Aby jeszcze bardziej pogrupować animacje, możesz określić zagnieżdżone tagi <set>. Każdy element <set> może mieć własny atrybut ordering.

Atrybuty:

android:ordering
Słowo kluczowe. Określa kolejność odtwarzania animacji w tym zestawie.
WartośćOpis
sequentiallyOdtwarzaj kolejno animacje z tego zestawu.
together (domyślna)Odtwarzaj animacje z tego zestawu jednocześnie.
<objectAnimator>
Animowanie określonej właściwości obiektu w określonym czasie. Reprezentuje obiekt ObjectAnimator.

Atrybuty:

android:propertyName
Ciąg znaków. Wymagany. Właściwość obiektu do animacji, do której odwołuje się jej nazwa. Możesz na przykład określić "alpha" lub "backgroundColor" dla obiektu View. Element objectAnimator nie ujawnia jednak atrybutu target, więc nie możesz ustawić animacji obiektu w deklaracji XML. Musisz zwiększyć zasób XML animacji, wywołując loadAnimator() i wywołując setTarget(), aby ustawić obiekt docelowy zawierający tę właściwość.
android:valueTo
float, int lub color. Wymagany. Wartość, w której kończy się właściwość animowana. Kolory są przedstawione w postaci 6-cyfrowych liczb szesnastkowych, np. #333333.
android:valueFrom
float, int lub color. Wartość, od której zaczyna się animowana właściwość. Jeśli go nie podasz, animacja rozpocznie się od wartości uzyskanej przez metodę get właściwości. Kolory są przedstawione w postaci 6-cyfrowych liczb szesnastkowych, np. #333333.
android:duration
int. Czas animacji w milisekundach. Wartość domyślna to 300 milisekund.
android:startOffset
int. Czas (w milisekundach) opóźnienia animacji po wywołaniu parametru start().
android:repeatCount
int. Ile razy ma być powtarzana animacja. Ustaw "-1", aby powtarzać w nieskończoność, lub na dodatnią liczbę całkowitą. Na przykład wartość "1" oznacza, że animacja jest powtarzana raz po pierwszym uruchomieniu, co oznacza, że łącznie odtworzy się 2 razy. Wartość domyślna to "0", co oznacza brak powtórzeń.
android:repeatMode
int. Sposób zachowania animacji po dotarciu do końca. Aby ten atrybut działał, atrybut android:repeatCount musi być dodatnią liczbą całkowitą lub wartością "-1". Ustaw jako "reverse", by animacja była przekierowywana w odwrotnym kierunku przy każdym powtórzeniu, lub "restart", by pętla animacji za każdym razem była odtwarzana od początku.
android:valueType
Słowo kluczowe. Nie określaj tego atrybutu, jeśli wartością jest kolor. Platforma animacji automatycznie obsługuje wartości kolorów.
WartośćOpis
intTypeOkreśla, że animowane wartości są liczbami całkowitymi.
floatType (domyślna)Określa, że animowane wartości są liczbami zmiennoprzecinkowymi.
<animator>
Wykonuje animację przez określony czas. Reprezentuje obiekt ValueAnimator.

Atrybuty:

android:valueTo
float, int lub color. Wymagany. Wartość, w której kończy się animacja. Kolory są przedstawione w postaci 6-cyfrowych liczb szesnastkowych, np. #333333.
android:valueFrom
float, int lub color. Wymagany. Wartość, w której rozpoczyna się animacja. Kolory są przedstawione w postaci 6-cyfrowych liczb szesnastkowych, np. #333333.
android:duration
int. Czas animacji w milisekundach. Wartość domyślna to 300 ms.
android:startOffset
int. Czas (w milisekundach) opóźnienia animacji po wywołaniu parametru start().
android:repeatCount
int. Ile razy ma być powtarzana animacja. Ustaw "-1", aby powtarzać w nieskończoność, lub na dodatnią liczbę całkowitą. Na przykład wartość "1" oznacza, że animacja jest powtarzana raz po pierwszym uruchomieniu, co oznacza, że łącznie odtworzy się 2 razy. Wartość domyślna to "0", co oznacza brak powtórzeń.
android:repeatMode
int. Sposób zachowania animacji po dotarciu do końca. Aby ten atrybut działał, atrybut android:repeatCount musi być dodatnią liczbą całkowitą lub wartością "-1". Ustaw jako "reverse", by animacja była przekierowywana w odwrotnym kierunku przy każdym powtórzeniu, lub "restart", by pętla animacji za każdym razem była odtwarzana od początku.
android:valueType
Słowo kluczowe. Nie określaj tego atrybutu, jeśli wartością jest kolor. Platforma animacji automatycznie obsługuje wartości kolorów.
WartośćOpis
intTypeOkreśla, że animowane wartości są liczbami całkowitymi.
floatType (domyślna)Określa, że animowane wartości są liczbami zmiennoprzecinkowymi.
przykład:

Plik XML zapisany res/animator/property_animator.xml:

<set android:ordering="sequentially">
    <set>
        <objectAnimator
            android:propertyName="x"
            android:duration="500"
            android:valueTo="400"
            android:valueType="intType"/>
        <objectAnimator
            android:propertyName="y"
            android:duration="500"
            android:valueTo="300"
            android:valueType="intType"/>
    </set>
    <objectAnimator
        android:propertyName="alpha"
        android:duration="500"
        android:valueTo="1f"/>
</set>

Aby uruchomić tę animację, przed rozpoczęciem zestawu animacji ustaw zasoby XML w swoim kodzie do obiektu AnimatorSet, a następnie ustaw obiekty docelowe dla wszystkich animacji. Wywołanie setTarget() ustawia jako wygodę jeden obiekt docelowy dla wszystkich elementów podrzędnych obiektu AnimatorSet. Poniższy kod pokazuje, jak to zrobić:

Kotlin

val set: AnimatorSet = AnimatorInflater.loadAnimator(myContext, R.animator.property_animator)
    .apply {
        setTarget(myObject)
        start()
    }

Java

AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,
    R.animator.property_animator);
set.setTarget(myObject);
set.start();
zobacz też:

Wyświetl animację

Platforma animacji widoku obsługuje zarówno animacje klatka po klatce, które są zadeklarowane w formacie XML. Poniżej znajdziesz informacje o korzystaniu z obu tych metod.

Animacja starszego typu

Animacja zdefiniowana w formacie XML, która wykonuje przejścia w grafice, takie jak obracanie, zanikanie, ruch i rozciąganie.

lokalizacja pliku:
res/anim/filename.xml
Jako identyfikator zasobu jest używana nazwa pliku.
typ danych skompilowanych zasobów:
Wskaźnik zasobu do Animation
odniesienie do zasobów:
W Javie: R.anim.filename
W pliku XML: @[package:]anim/filename
składnia:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@[package:]anim/interpolator_resource"
    android:shareInterpolator=["true" | "false"] >
    <alpha
        android:fromAlpha="float"
        android:toAlpha="float" />
    <scale
        android:fromXScale="float"
        android:toXScale="float"
        android:fromYScale="float"
        android:toYScale="float"
        android:pivotX="float"
        android:pivotY="float" />
    <translate
        android:fromXDelta="float"
        android:toXDelta="float"
        android:fromYDelta="float"
        android:toYDelta="float" />
    <rotate
        android:fromDegrees="float"
        android:toDegrees="float"
        android:pivotX="float"
        android:pivotY="float" />
    <set>
        ...
    </set>
</set>

Plik musi zawierać 1 element główny: element <alpha>, <scale>, <translate>, <rotate> lub <set>, który zawiera grupę (lub grupy) innych elementów animacji (w tym zagnieżdżone elementy <set>).

elementy:
<set>
Kontener, który zawiera inne elementy animacji (<alpha>, <scale>, <translate>, <rotate>) lub inne elementy <set>. Reprezentuje obiekt AnimationSet.

Atrybuty:

android:interpolator
Zasób interpolatora. Element Interpolator do zastosowania w animacji. Wartość musi być odwołaniem do zasobu określającego interpolator, a nie nazwę klasy interpolatora. Platforma udostępnia zasoby domyślnego interpolatora. Możesz też utworzyć własny zasób interpolatora. Więcej informacji o interpolatorach znajdziesz poniżej.
android:shareInterpolator
Wartość logiczna. "true", jeśli chcesz używać tego samego interpolatora między wszystkimi elementami podrzędnymi.
<alpha>
Animacja rozjaśniania lub zanikania. Reprezentuje obiekt AlphaAnimation.

Atrybuty:

android:fromAlpha
Pływające. Początkowa wartość przesunięcia przezroczystości, gdzie 0,0 oznacza przezroczystość, a 1,0 – nieprzezroczystość.
android:toAlpha
Pływające. Końcowe przesunięcie przezroczystości, gdzie 0,0 oznacza przezroczystość, a 1,0 – nieprzezroczystość.

Więcej atrybutów obsługiwanych przez <alpha> znajdziesz w dokumentacji klasy Animation, której atrybuty XML są dziedziczone przez ten element.

<scale>
Animacja zmieniająca rozmiar. Możesz określić punkt środkowy obrazu, z którego będzie się rozciągał na zewnątrz lub do środka, używając parametrów pivotX i pivotY. Jeśli np. te wartości to 0,0 (lewy górny róg), cały wzrost następuje w dół i w prawo. Reprezentuje obiekt ScaleAnimation.

Atrybuty:

android:fromXScale
Pływające. Początkowe przesunięcie rozmiaru X, gdzie 1,0 jest bez zmian.
android:toXScale
Pływające. Końcowe przesunięcie rozmiaru X, gdzie 1,0 jest bez zmian.
android:fromYScale
Pływające. Początkowe przesunięcie rozmiaru Y, gdzie 1,0 jest bez zmian.
android:toYScale
Pływające. Odsunięcie rozmiaru na końcu Y, gdzie 1,0 jest bez zmian.
android:pivotX
Pływające. Współrzędna X, która pozostaje stała podczas skalowania obiektu.
android:pivotY
Pływające. Współrzędna Y pozostaje stała podczas skalowania obiektu.

Więcej atrybutów obsługiwanych przez <scale> znajdziesz w dokumentacji klasy Animation, której atrybuty XML są dziedziczone przez ten element.

<translate>
Ruch w pionie lub w poziomie. Reprezentuje obiekt TranslateAnimation. Obsługuje te atrybuty w dowolnym z tych 3 formatów:
  • Wartości od -100 do 100 kończące się „%”, które wskazują odsetek względem niej.
  • Wartości od -100 do 100 kończących się cyframi „%p”, które wskazują wartość procentową w stosunku do jej wartości nadrzędnej.
  • Wartość zmiennoprzecinkowa bez sufiksu, wskazująca wartość bezwzględną.

Atrybuty:

android:fromXDelta
Liczba zmiennoprzecinkowa lub procentowa. Przesunięcie na osi X. Wyrażona w pikselach względem normalnej pozycji, np. "5", w procentach względem szerokości elementu, np. "5%", lub w procentach względem szerokości nadrzędnej, np. "5%p".
android:toXDelta
Liczba zmiennoprzecinkowa lub procentowa. Przesunięcie na końcu X. Wyrażona w pikselach względem normalnej pozycji, np. "5", w procentach względem szerokości elementu, np. "5%", lub w procentach względem szerokości nadrzędnej, np. "5%p".
android:fromYDelta
Liczba zmiennoprzecinkowa lub procentowa. Początkowe przesunięcie Y. Wyrażona w pikselach względem normalnej pozycji, np. "5", w procentach względem wysokości elementu, np. "5%", lub w procentach względem wysokości elementu nadrzędnego, np. "5%p".
android:toYDelta
Liczba zmiennoprzecinkowa lub procentowa. Przesunięcie na osi Y. Wyrażona w pikselach względem normalnej pozycji, np. "5", w procentach względem wysokości elementu, np. "5%", lub w procentach względem wysokości elementu nadrzędnego, np. "5%p".

Więcej atrybutów obsługiwanych przez <translate> znajdziesz w dokumentacji klasy Animation, której atrybuty XML są dziedziczone przez ten element.

<rotate>
Animacja obrotowa. Reprezentuje obiekt RotateAnimation.

Atrybuty:

android:fromDegrees
Pływające. Położenie kątowe podane w stopniach.
android:toDegrees
Pływające. Położenie kątowe na końcu (w stopniach).
android:pivotX
Liczba zmiennoprzecinkowa lub procentowa. Współrzędna X środka obrotu. Wyrażona w pikselach względem lewej krawędzi obiektu, na przykład "5", procentowo względem lewej krawędzi obiektu, np. "5%", lub procentowo względem lewej krawędzi kontenera nadrzędnego, np. "5%p".
android:pivotY
Liczba zmiennoprzecinkowa lub procentowa. Współrzędna Y środka obrotu. Wyrażona w pikselach względem górnej krawędzi obiektu, na przykład "5", jako procent względem górnej krawędzi obiektu, np. "5%", lub procentowo względem górnej krawędzi kontenera nadrzędnego, np. "5%p".

Więcej atrybutów obsługiwanych przez <rotate> znajdziesz w dokumentacji klasy Animation, której atrybuty XML są dziedziczone przez ten element.

przykład:

Plik XML zapisany res/anim/hyperspace_jump.xml:

<set xmlns:android="http://schemas.android.com/apk/res/android"
    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/accelerate_interpolator"
        android:startOffset="700">
        <scale
            android:fromXScale="1.4"
            android:toXScale="0.0"
            android:fromYScale="0.6"
            android:toYScale="0.0"
            android:pivotX="50%"
            android:pivotY="50%"
            android:duration="400" />
        <rotate
            android:fromDegrees="0"
            android:toDegrees="-45"
            android:toYScale="0.0"
            android:pivotX="50%"
            android:pivotY="50%"
            android:duration="400" />
    </set>
</set>

Ten kod aplikacji stosuje animację do obiektu ImageView i uruchamia ją:

Kotlin

val image: ImageView = findViewById(R.id.image)
val hyperspaceJump: Animation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump)
image.startAnimation(hyperspaceJump)

Java

ImageView image = (ImageView) findViewById(R.id.image);
Animation hyperspaceJump = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
image.startAnimation(hyperspaceJump);
zobacz też:

Interpolatory

Interpolator to modyfikator animacji zdefiniowany w pliku XML, który wpływa na szybkość zmian w animacji. Umożliwia to przyspieszanie, zwalnianie, powtarzanie, odrzucanie itd. istniejących efektów animacji.

Do elementu animacji z atrybutem android:interpolator stosowany jest interpolator, którego wartość jest odwołaniem do zasobu interpolatora.

Wszystkie interpolatory dostępne w Androidzie należą do podklas klasy Interpolator. W przypadku każdej klasy interpolatora Android zawiera zasób publiczny, do którego możesz się odwołać, aby zastosować interpolator do animacji przy użyciu atrybutu android:interpolator. Poniższa tabela określa zasób, który będzie używany dla każdego interpolatora:

Klasa interpolatoraIdentyfikator zasobu
AccelerateDecelerateInterpolator @android:anim/accelerate_decelerate_interpolator
AccelerateInterpolator @android:anim/accelerate_interpolator
AnticipateInterpolator @android:anim/anticipate_interpolator
AnticipateOvershootInterpolator @android:anim/anticipate_overshoot_interpolator
BounceInterpolator @android:anim/bounce_interpolator
CycleInterpolator @android:anim/cycle_interpolator
DecelerateInterpolator @android:anim/decelerate_interpolator
LinearInterpolator @android:anim/linear_interpolator
OvershootInterpolator @android:anim/overshoot_interpolator

Oto, jak możesz zastosować jedną z nich za pomocą atrybutu android:interpolator:

<set android:interpolator="@android:anim/accelerate_interpolator">
    ...
</set>

Niestandardowe interpolatory

Jeśli interpolatory dostarczane przez platformę nie spełniają Twoich oczekiwań, możesz utworzyć zasób interpolatora niestandardowego ze zmodyfikowanymi atrybutami. Możesz na przykład dostosować tempo przyspieszenia dla funkcji AnticipateInterpolator lub liczbę cykli dla elementu CycleInterpolator. Aby to zrobić, trzeba utworzyć w pliku XML własny zasób interpolatora.

lokalizacja pliku:
res/anim/filename.xml
Jako identyfikator zasobu jest używana nazwa pliku.
typ danych skompilowanych zasobów:
Wskaźnik zasobu do odpowiedniego obiektu interpolatora
odniesienie do zasobów:
W formacie XML: @[package:]anim/filename
składnia:
<?xml version="1.0" encoding="utf-8"?>
<InterpolatorName xmlns:android="http://schemas.android.com/apk/res/android"
    android:attribute_name="value"
    />

Jeśli nie zastosujesz żadnych atrybutów, interpolator będzie działać dokładnie tak samo jak funkcje podane przez platformę (wymienione w poprzedniej tabeli).

elementy:
Zwróć uwagę, że każda implementacja Interpolator, po zdefiniowaniu w pliku XML, ma nazwę zaczynającą się od małej litery.

<accelerateDecelerateInterpolator>
Tempo zmian powoli się rozpoczyna i kończy, a w środku przyspiesza.

Brak atrybutów.

<accelerateInterpolator>
Tempo zmian na początku zaczyna się powoli, a następnie przyspiesza.

Atrybuty:

android:factor
Pływające. Szybkość przyspieszenia. Wartość domyślna to 1.
<anticipateInterpolator>
Zmiana rozpoczyna się wstecz, a następnie przewija do przodu.

Atrybuty:

android:tension
Pływające. Wymagany napięcie. Wartość domyślna to 2.
<anticipateOvershootInterpolator>
Zmiana zaczyna się wstecz, następnie przesuwa do przodu i przekracza wartość docelową, a następnie osiąga wartość końcową.

Atrybuty:

android:tension
Pływające. Wymagany napięcie. Wartość domyślna to 2.
android:extraTension
Pływające. Ilość, przez którą mnożymy napięcie. Wartością domyślną jest 1,5.
<bounceInterpolator>
Zmiana jest odrzucana na końcu.

Brak atrybutów

<cycleInterpolator>
Powtarza animację przez określoną liczbę cykli. Tempo zmian ma charakter sinusoidalny.

Atrybuty:

android:cycles
Liczba całkowita. Liczba cykli. Wartość domyślna to 1.
<decelerateInterpolator>
Tempo zmian na początku ma szybkie tempo, a następnie maleje.

Atrybuty:

android:factor
Pływające. Tempo spowolnienia. Wartość domyślna to 1.
<linearInterpolator>
Tempo zmian jest stałe.

Brak atrybutów.

<overshootInterpolator>
Zmiana zostaje przesunięta do przodu, przekracza ostatnią wartość, a następnie powraca.

Atrybuty:

android:tension
Pływające. Wymagany napięcie. Wartość domyślna to 2.
przykład:

Plik XML zapisany res/anim/my_overshoot_interpolator.xml:

<?xml version="1.0" encoding="utf-8"?>
<overshootInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
    android:tension="7.0"
    />

W tym pliku XML animacji stosowany jest interpolator:

<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@anim/my_overshoot_interpolator"
    android:fromXScale="1.0"
    android:toXScale="3.0"
    android:fromYScale="1.0"
    android:toYScale="3.0"
    android:pivotX="50%"
    android:pivotY="50%"
    android:duration="700" />

Animacja klatki

Animacja zdefiniowana w języku XML, która przedstawia sekwencję obrazów w określonej kolejności, tak jak w przypadku filmu.

lokalizacja pliku:
res/drawable/filename.xml
Jako identyfikator zasobu jest używana nazwa pliku.
typ danych skompilowanych zasobów:
Wskaźnik zasobu do AnimationDrawable
odniesienie do zasobów:
W Javie: R.drawable.filename
W pliku XML: @[package:]drawable.filename
składnia:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot=["true" | "false"] >
    <item
        android:drawable="@[package:]drawable/drawable_resource_name"
        android:duration="integer" />
</animation-list>
elementy:
<animation-list>
Wymagane. Musi to być element główny. Zawiera co najmniej 1 element <item>.

Atrybuty:

android:oneshot
Wartość logiczna. "true" – jeśli chcesz wykonać animację raz, "false" – zapętlenie.
<item>
Pojedyncza klatka animacji. Musi być elementem podrzędnym elementu <animation-list>.

Atrybuty:

android:drawable
Zasób rysowalny. Obiekt rysowalny do użycia w tej ramce.
android:duration
Liczba całkowita. Czas wyświetlania tej klatki (w milisekundach).
przykład:

Plik XML zapisany res/drawable/rocket_thrust.xml:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <item android:drawable="@drawable/rocket_thrust1" android:duration="200" />
    <item android:drawable="@drawable/rocket_thrust2" android:duration="200" />
    <item android:drawable="@drawable/rocket_thrust3" android:duration="200" />
</animation-list>

Ten kod aplikacji ustawia animację jako tło dla elementu View, a następnie ją odtwarza:

Kotlin

val rocketImage: ImageView = findViewById(R.id.rocket_image)
rocketImage.setBackgroundResource(R.drawable.rocket_thrust)

val rocketAnimation = rocketImage.background
if (rocketAnimation is Animatable) {
    rocketAnimation.start()
}

Java

ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust);

rocketAnimation = rocketImage.getBackground();
if (rocketAnimation instanceof Animatable) {
    ((Animatable)rocketAnimation).start();
}
zobacz też: