Ресурсы анимации

Ресурс анимации может определять один из двух типов анимации:

Анимация свойств
Создает анимацию, изменяя значения свойств объекта в течение заданного периода времени с помощью Animator.
Посмотреть анимацию

С помощью фреймворка View Animation можно создавать анимации двух типов:

Анимация свойств

Анимация, определенная в XML, которая изменяет свойства целевого объекта, такие как цвет фона или значение альфа-канала, в течение заданного периода времени.

местоположение файла;
res/animator/filename.xml
Название файла используется в качестве идентификатора ресурса.
скомпилированный тип данных ресурса:
Указатель ресурса на ValueAnimator, ObjectAnimator или AnimatorSet
ссылка на ресурс:
В коде на Java или Kotlin: R.animator.filename
В XML: @[package:]animator/filename
Синтаксис:
<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>

У файла должен быть один корневой элемент: <set>, <objectAnimator> или <valueAnimator>. Элементы анимации можно группировать внутри элемента <set>, в том числе с другими элементами <set>.

elements:
<set>
Контейнер, в котором содержатся другие элементы анимации (<objectAnimator>, <valueAnimator> или другие элементы <set>). Представляет собой AnimatorSet.

Вы можете указать вложенные теги <set>, чтобы дополнительно сгруппировать анимации. Для каждого элемента <set> можно задать собственный атрибут ordering.

Атрибуты:

android:ordering
Ключевое слово. Определяет порядок воспроизведения анимаций в этом наборе.
ЗначениеОписание
sequentiallyВоспроизводить анимации из этого набора последовательно.
together (по умолчанию)Воспроизводить анимации из этого набора одновременно.
<objectAnimator>
Анимирует определенное свойство объекта в течение заданного времени. Представляет собой ObjectAnimator.

Атрибуты:

android:propertyName
Строка. Обязательный параметр. Свойство объекта, которое нужно анимировать, указанное по названию. Например, для объекта View можно указать "alpha" или "backgroundColor". Однако элемент objectAnimator не предоставляет атрибут target, поэтому вы не можете задать объект для анимации в XML-декларации. Вам нужно распаковать XML-ресурс анимации, вызвав loadAnimator(), и вызвать setTarget(), чтобы задать целевой объект, содержащий это свойство.
android:valueTo
float, int или color. Обязательный параметр. Значение, на котором заканчивается анимированное свойство. Цвета указываются в виде шестизначных шестнадцатеричных чисел, например #333333.
android:valueFrom
float, int или color. Значение, с которого начинается анимация свойства. Если значение не указано, анимация начинается со значения, полученного методом get свойства. Цвета указываются в виде шестизначных шестнадцатеричных чисел, например #333333.
android:duration
int. Длительность анимации в миллисекундах. Значение по умолчанию – 300 миллисекунд.
android:startOffset
int. Количество миллисекунд, на которое задерживается анимация после вызова start().
android:repeatCount
int. Сколько раз нужно повторить анимацию. Укажите "-1", чтобы анимация повторялась бесконечно, или положительное целое число. Например, значение "1" означает, что анимация будет повторена один раз после первого воспроизведения, то есть всего она будет показана дважды. Значение по умолчанию – "0" (без повторения).
android:repeatMode
int. Поведение анимации по достижении конца. Чтобы этот атрибут работал, для android:repeatCount нужно задать положительное целое число или "-1". Укажите "reverse", чтобы анимация меняла направление при каждом повторе, или "restart", чтобы она каждый раз начиналась сначала.
android:valueType
Ключевое слово. Не указывайте этот атрибут, если значением является цвет. Фреймворк анимации автоматически обрабатывает значения цвета.
ЗначениеОписание
intTypeУказывает, что анимированные значения являются целыми числами.
floatType (по умолчанию)Указывает, что анимированные значения являются числами с плавающей запятой.
<animator>
Выполняет анимацию в течение заданного времени. Представляет ValueAnimator.

Атрибуты:

android:valueTo
float, int или color. Обязательный параметр. Значение, на котором анимация заканчивается. Цвета указываются в виде шестизначных шестнадцатеричных чисел, например #333333.
android:valueFrom
float, int или color. Обязательный параметр. Значение, с которого начинается анимация. Цвета указываются в виде шестизначных шестнадцатеричных чисел, например #333333.
android:duration
int. Длительность анимации в миллисекундах. Значение по умолчанию – 300 мс.
android:startOffset
int. Количество миллисекунд, на которое задерживается анимация после вызова start().
android:repeatCount
int. Сколько раз нужно повторить анимацию. Чтобы повтор был бесконечным, укажите значение "-1". Также можно указать положительное целое число. Например, значение "1" означает, что анимация будет повторена один раз после первого воспроизведения, то есть всего она будет показана дважды. Значение по умолчанию – "0" (без повторения).
android:repeatMode
int. Поведение анимации по достижении конца. Чтобы этот атрибут работал, для android:repeatCount нужно задать положительное целое число или "-1". Укажите "reverse", чтобы анимация меняла направление при каждом повторе, или "restart", чтобы она каждый раз начиналась сначала.
android:valueType
Ключевое слово. Не указывайте этот атрибут, если значением является цвет. Фреймворк анимации автоматически обрабатывает значения цвета.
ЗначениеОписание
intTypeУказывает, что анимированные значения являются целыми числами.
floatType (по умолчанию)Указывает, что анимированные значения являются числами с плавающей запятой.
пример:

XML-файл сохранен в 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>

Чтобы запустить эту анимацию, преобразуйте XML-ресурсы в коде в объект AnimatorSet, а затем задайте целевые объекты для всех анимаций, прежде чем запускать набор анимаций. Вызов setTarget() задает один целевой объект для всех дочерних элементов AnimatorSet. Ниже показано, как это сделать.

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();
См. также:

Посмотреть анимацию

Фреймворк анимации представлений поддерживает как промежуточную, так и покадровую анимацию, которые объявляются в XML. Ниже описано, как использовать оба метода.

Промежуточная анимация

Анимация, определенная в XML, которая выполняет переходы на графике, такие как вращение, затухание, перемещение и растяжение.

местоположение файла;
res/anim/filename.xml
Название файла используется в качестве идентификатора ресурса.
скомпилированный тип данных ресурса:
Указатель ресурса на Animation
ссылка на ресурс:
В Java: R.anim.filename
В XML: @[package:]anim/filename
Синтаксис:
<?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>

В файле должен быть один корневой элемент: <alpha>, <scale>, <translate>, <rotate> или <set>, который содержит группу (или группы) других элементов анимации (включая вложенные элементы <set>).

elements:
<set>
Контейнер, в котором содержатся другие элементы анимации (<alpha>, <scale>, <translate>, <rotate>) или другие элементы <set>. Представляет AnimationSet.

Атрибуты:

android:interpolator
Ресурс интерполятора. Interpolator, который нужно применить к анимации. Значение должно быть ссылкой на ресурс, который указывает интерполятор, а не название класса интерполятора. Вы можете использовать стандартные ресурсы интерполятора, доступные на платформе, или создать собственные. Подробнее об интерполяторах…
android:shareInterpolator
Логическое значение. "true", если вы хотите использовать один и тот же интерполятор для всех дочерних элементов.
<alpha>
Анимация появления или исчезновения. Представляет AlphaAnimation.

Атрибуты:

android:fromAlpha
Float. Начальное смещение прозрачности, где 0,0 – прозрачный, а 1,0 – непрозрачный.
android:toAlpha
Float. Смещение непрозрачности в конце, где 0.0 – прозрачный, а 1.0 – непрозрачный.

Дополнительные атрибуты, поддерживаемые <alpha>, перечислены в справочнике по классу Animation, XML-атрибуты которого наследуются этим элементом.

<scale>
Анимация изменения размера. Вы можете указать центральную точку изображения, от которой оно будет увеличиваться или уменьшаться, задав значения pivotX и pivotY. Например, если эти значения равны 0,0 (левый верхний угол), то все увеличение происходит вниз и вправо. Представляет ScaleAnimation.

Атрибуты:

android:fromXScale
Float. Смещение начального размера по оси X, где 1,0 – без изменений.
android:toXScale
Float. Смещение конечного размера по оси X, где 1.0 – без изменений.
android:fromYScale
Float. Начальное смещение размера по оси Y, где 1.0 – без изменений.
android:toYScale
Float. Смещение конечного размера по оси Y, где 1.0 – без изменений.
android:pivotX
Float. Координата X, которая должна оставаться фиксированной при масштабировании объекта.
android:pivotY
Float. Координата Y, которая должна оставаться фиксированной при масштабировании объекта.

Дополнительные атрибуты, поддерживаемые <scale>, перечислены в справочнике по классу Animation, XML-атрибуты которого наследуются этим элементом.

<translate>
Вертикальное и/или горизонтальное движение. Представляет собой TranslateAnimation. Поддерживает следующие атрибуты в любом из трех форматов:
  • Значения от -100 до 100, заканчивающиеся символом "%", указывают на процент относительно самого себя.
  • Значения от -100 до 100, заканчивающиеся на "%p", указывают на процент относительно родительского элемента.
  • Число с плавающей запятой без суффикса, указывающее абсолютное значение.

Атрибуты:

android:fromXDelta
Число с плавающей запятой или процентное значение. Начальное смещение по оси X. Значение можно указать в пикселях относительно нормального положения (например, "5"), в процентах относительно ширины элемента (например, "5%") или в процентах относительно ширины родительского элемента (например, "5%p").
android:toXDelta
Число с плавающей запятой или процентное значение. Смещение по оси X в конце. Значение можно указать в пикселях относительно нормального положения (например, "5"), в процентах относительно ширины элемента (например, "5%") или в процентах относительно ширины родительского элемента (например, "5%p").
android:fromYDelta
Число с плавающей запятой или процентное значение. Начальное смещение по оси Y. Выражается в пикселях относительно нормального положения (например, "5"), в процентах относительно высоты элемента (например, "5%") или в процентах относительно высоты родительского элемента (например, "5%p").
android:toYDelta
Число с плавающей запятой или процентное значение. Конечное смещение по оси Y. Значение можно указать в пикселях относительно нормального положения (например, "5"), в процентах относительно высоты элемента (например, "5%") или в процентах относительно высоты родительского элемента (например, "5%p").

Дополнительные атрибуты, поддерживаемые <translate>, перечислены в справочнике по классу Animation, XML-атрибуты которого наследуются этим элементом.

<rotate>
Анимация вращения. Представляет RotateAnimation.

Атрибуты:

android:fromDegrees
Float. Начальное угловое положение в градусах.
android:toDegrees
Float. Конечное угловое положение в градусах.
android:pivotX
Число с плавающей запятой или процентное значение. Координата X центра вращения. Значение можно указать в пикселях относительно левого края объекта (например, "5"), в процентах относительно левого края объекта (например, "5%") или в процентах относительно левого края родительского контейнера (например, "5%p").
android:pivotY
Число с плавающей запятой или процентное значение. Координата Y центра вращения. Значение можно указать в пикселях относительно верхнего края объекта (например, "5"), в процентах относительно верхнего края объекта (например, "5%") или в процентах относительно верхнего края родительского контейнера (например, "5%p").

Дополнительные атрибуты, поддерживаемые <rotate>, перечислены в справочнике по классу Animation, XML-атрибуты которого наследуются этим элементом.

пример:

XML-файл сохранен в 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>

В следующем коде приложения анимация применяется к объекту ImageView и запускается:

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);
См. также:

Интерполяторы

Интерполятор – это модификатор анимации, определенный в XML, который влияет на скорость изменения анимации. Это позволяет ускорять, замедлять, повторять, отражать и т. д. существующие эффекты анимации.

Интерполятор применяется к элементу анимации с атрибутом android:interpolator, значение которого является ссылкой на ресурс интерполятора.

Все интерполяторы, доступные в Android, являются подклассами класса Interpolator. Для каждого класса интерполятора Android включает общедоступный ресурс, на который вы можете ссылаться, чтобы применить интерполятор к анимации с помощью атрибута android:interpolator. В следующей таблице указан ресурс, который следует использовать для каждого интерполятора:

Класс интерполятораИдентификатор ресурса
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

Вот как можно указать одно из этих значений с помощью атрибута android:interpolator:

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

Пользовательские интерполяторы

Если вас не устраивают интерполяторы, предоставляемые платформой, вы можете создать собственный ресурс интерполятора с измененными атрибутами. Например, вы можете настроить скорость ускорения для AnticipateInterpolator или количество циклов для CycleInterpolator. Для этого создайте собственный ресурс интерполятора в XML-файле.

местоположение файла;
res/anim/filename.xml
Название файла используется в качестве идентификатора ресурса.
скомпилированный тип данных ресурса:
Указатель ресурса на соответствующий объект интерполятора.
ссылка на ресурс:
В XML: @[package:]anim/filename
Синтаксис:
<?xml version="1.0" encoding="utf-8"?>
<InterpolatorName xmlns:android="http://schemas.android.com/apk/res/android"
    android:attribute_name="value"
    />

Если вы не примените никаких атрибутов, ваш интерполятор будет работать точно так же, как и те, которые предоставляются платформой и перечислены в предыдущей таблице.

elements:
Обратите внимание, что в XML-коде название каждой реализации Interpolator начинается со строчной буквы.

<accelerateDecelerateInterpolator>
Скорость изменения низкая в начале и в конце, но высокая в середине.

Нет атрибутов.

<accelerateInterpolator>
Скорость изменения сначала низкая, а затем увеличивается.

Атрибуты:

android:factor
Float. Скорость ускорения. Значение по умолчанию – 1.
<anticipateInterpolator>
Изменение начинается в обратном направлении, а затем резко переходит в прямое.

Атрибуты:

android:tension
Float. Сила натяжения. Значение по умолчанию – 2.
<anticipateOvershootInterpolator>
Изменение начинается в обратном направлении, затем резко переходит вперед и превышает целевое значение, а затем устанавливается на конечном значении.

Атрибуты:

android:tension
Float. Сила натяжения. Значение по умолчанию – 2.
android:extraTension
Float. Коэффициент, на который умножается натяжение. Значение по умолчанию – 1,5.
<bounceInterpolator>
В конце изменения происходит отскок.

Нет атрибутов

<cycleInterpolator>
Повторяет анимацию указанное количество раз. Скорость изменения следует синусоидальной схеме.

Атрибуты:

android:cycles
Целое число. Количество циклов. Значение по умолчанию – 1.
<decelerateInterpolator>
Скорость изменения сначала высокая, а затем снижается.

Атрибуты:

android:factor
Float. Скорость замедления. Значение по умолчанию – 1.
<linearInterpolator>
Скорость изменения постоянна.

Нет атрибутов.

<overshootInterpolator>
Изменение переходит за последнее значение, а затем возвращается.

Атрибуты:

android:tension
Float. Сила натяжения. Значение по умолчанию – 2.
пример:

XML-файл сохранен в 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"
    />

Этот XML-код анимации применяет интерполятор:

<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" />

Покадровая анимация

Анимация, определенная в XML, которая показывает последовательность изображений по порядку, как в фильме.

местоположение файла;
res/drawable/filename.xml
Название файла используется в качестве идентификатора ресурса.
скомпилированный тип данных ресурса:
Указатель ресурса на AnimationDrawable
ссылка на ресурс:
В Java: R.drawable.filename
В XML: @[package:]drawable.filename
Синтаксис:
<?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>
elements:
<animation-list>
Обязательный атрибут. Это должен быть корневой элемент. Содержит один или несколько элементов <item>.

Атрибуты:

android:oneshot
Логическое значение. "true", если вы хотите, чтобы анимация воспроизводилась один раз, или "false", если вы хотите, чтобы она повторялась.
<item>
Один кадр анимации. Должен быть дочерним элементом <animation-list>.

Атрибуты:

android:drawable
Прорисовываемый ресурс. Объект Drawable, который будет использоваться для этого кадра.
android:duration
Целое число. Продолжительность показа кадра в миллисекундах.
пример:

XML-файл сохранен в 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>

В следующем коде приложения анимация устанавливается в качестве фона для View, а затем воспроизводится:

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();
}
См. также: