Специальный переход позволяет создать анимацию, которая недоступна ни в одном из встроенных классов переходов. Например, вы можете определить специальный переход, который меняет цвет текста и полей ввода на серый, чтобы показать, что поля отключены на новом экране. Это изменение помогает пользователям увидеть, какие поля вы отключили.
Пользовательский переход, как и один из встроенных типов переходов, применяет анимацию к дочерним представлениям как начальной, так и конечной сцен. Однако, в отличие от встроенных типов переходов, вам необходимо предоставить код, который фиксирует значения свойств и генерирует анимацию. Вы также можете определить подмножество целевых представлений для своей анимации.
This page teaches you how to capture property values and generate animations to create custom transitions.
Расширение класса Transition
Чтобы создать собственный переход, добавьте в проект класс, расширяющий класс Transition, и переопределите функции, показанные в следующем фрагменте кода:
Kotlin
class CustomTransition : Transition() { override fun captureStartValues(transitionValues: TransitionValues) {} override fun captureEndValues(transitionValues: TransitionValues) {} override fun createAnimator( sceneRoot: ViewGroup, startValues: TransitionValues?, endValues: TransitionValues? ): Animator? {} }
Java
public class CustomTransition extends Transition { @Override public void captureStartValues(TransitionValues values) {} @Override public void captureEndValues(TransitionValues values) {} @Override public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, TransitionValues endValues) {} }
В разделах ниже рассказывается, как переопределить эти функции.
Зафиксировать значения свойств области просмотра
В анимации переходов используется система анимации свойств, описанная в статье Обзор анимации свойств. Анимация свойств изменяет свойство представления от начального значения до конечного значения за указанный период времени, поэтому для создания анимации фреймворку необходимы как начальное, так и конечное значения свойства.
Однако для анимации свойств обычно требуется лишь небольшое подмножество всех значений свойств представления. Например, для анимации цвета нужны значения свойства цвета, а для анимации движения – значения свойства положения. Поскольку значения свойств, необходимые для анимации, зависят от перехода, фреймворк переходов не предоставляет переходу все значения свойств. Вместо этого фреймворк вызывает функции обратного вызова, которые позволяют переходу захватывать только нужные ему значения свойств и сохранять их во фреймворке.
Зафиксируйте начальные значения
Чтобы передать фреймворку значения начального представления, реализуйте функцию captureStartValues(transitionValues). Фреймворк вызывает эту функцию для каждого представления в начальной сцене. Аргумент функции – это объект TransitionValues, который содержит ссылку на представление и экземпляр Map, в котором можно хранить нужные значения представления. В своей реализации извлеките эти значения свойств и передайте их обратно в фреймворк, сохранив их в карте.
Чтобы ключ для значения свойства не конфликтовал с другими ключами TransitionValues, используйте следующую схему именования:
package_name:transition_name:property_name
В следующем фрагменте кода показана реализация функции captureStartValues():
Kotlin
class CustomTransition : Transition() { // Define a key for storing a property value in // TransitionValues.values with the syntax // package_name:transition_class:property_name to avoid collisions private val PROPNAME_BACKGROUND = "com.example.android.customtransition:CustomTransition:background" override fun captureStartValues(transitionValues: TransitionValues) { // Call the convenience method captureValues captureValues(transitionValues) } // For the view in transitionValues.view, get the values you // want and put them in transitionValues.values private fun captureValues(transitionValues: TransitionValues) { // Get a reference to the view val view = transitionValues.view // Store its background property in the values map transitionValues.values[PROPNAME_BACKGROUND] = view.background } ... }
Java
public class CustomTransition extends Transition { // Define a key for storing a property value in // TransitionValues.values with the syntax // package_name:transition_class:property_name to avoid collisions private static final String PROPNAME_BACKGROUND = "com.example.android.customtransition:CustomTransition:background"; @Override public void captureStartValues(TransitionValues transitionValues) { // Call the convenience method captureValues captureValues(transitionValues); } // For the view in transitionValues.view, get the values you // want and put them in transitionValues.values private void captureValues(TransitionValues transitionValues) { // Get a reference to the view View view = transitionValues.view; // Store its background property in the values map transitionValues.values.put(PROPNAME_BACKGROUND, view.getBackground()); } ... }
Регистрация конечных значений
Фреймворк вызывает функцию captureEndValues(TransitionValues) один раз для каждого целевого представления в конечной сцене. Во всех остальных отношениях captureEndValues() работает так же, как и captureStartValues().
В приведенном ниже фрагменте кода показано, как реализовать функцию captureEndValues().
Kotlin
override fun captureEndValues(transitionValues: TransitionValues) { captureValues(transitionValues) }
Java
@Override public void captureEndValues(TransitionValues transitionValues) { captureValues(transitionValues); }
В этом примере функции captureStartValues() и captureEndValues() вызывают captureValues(), чтобы получить и сохранить значения. Свойство представления, которое извлекает captureValues(), остается прежним, но имеет разные значения в начальной и конечной сценах. Фреймворк поддерживает отдельные карты для начального и конечного состояний представления.
Как создать собственный аниматор
Чтобы анимировать изменения представления между его состоянием в начальной сцене и его состоянием в конечной сцене, предоставьте аниматор, переопределив функцию createAnimator(). Когда фреймворк вызывает эту функцию, он передает корневое представление сцены и объекты TransitionValues, содержащие начальные и конечные значения, которые вы зафиксировали.
Количество вызовов функции createAnimator() зависит от изменений, которые происходят между начальной и конечной сценами.
Например, можно реализовать анимацию затухания или появления в виде пользовательского перехода. Если в начальной сцене пять целей, две из которых удалены из конечной сцены, а в конечной сцене есть три цели из начальной сцены плюс новая цель, то фреймворк вызывает createAnimator() шесть раз.
Три вызова анимируют затухание и появление целей, которые остаются в обоих объектах сцены. Ещё два вызова анимируют затухание целей, удаленных из конечной сцены. Один вызов анимирует появление новой цели в конечной сцене.
Для целевых представлений, которые существуют как в начальной, так и в конечной сцене, фреймворк предоставляет объект TransitionValues для аргументов startValues и endValues. Для целевых представлений, которые существуют только в начальной или конечной сцене, фреймворк предоставляет объект TransitionValues для соответствующего аргумента и null для другого.
Чтобы реализовать функцию createAnimator(ViewGroup, TransitionValues, TransitionValues) при создании пользовательского перехода, используйте значения свойств представления, которые вы зафиксировали, чтобы создать объект Animator и вернуть его в фреймворк. Пример реализации можно найти в классе ChangeColor в примере
CustomTransition. Подробнее об анимации свойств…
Как применить собственный переход
Собственные переходы работают так же, как и встроенные. Вы можете применить собственный переход с помощью менеджера переходов, как описано в разделе Применение перехода.