Android Transitions: Transition, вступление, базовая теория

Что такое Transition?

Artem Shevchenko
4 min readJul 3, 2018

Главный двигатель красивого анимированного перехода в рамках одного экрана или между экранами — это конечно Transition.

Transition — это класс, который выполняет две задачи. Во-первых он анализирует и сохраняет свойства View до и после изменений. Во-вторых он отвечает за анимирование перехода View из состояния “До” в “После”. Посколько в этом цикле публикаций нас больше интересует анимированный переход между экранами, то экран А (тот с которого мы переходим) и экран Б (а это куда мы переходим) это и есть View до/после для нашего Transition.

Transition сам по себе класс не сложный и научится работать с ним просто. Он удобно инкапсулирует в себе сложность создания и настройки анимации и позволяет буквально императивно настраивать анимацию перехода. Я бы сравнил Transition с водителем такси — мы знаем откуда и куда нам ехать, а уже водитель решает каким маршрутом нам ехать и какую передачу когда включать.

Каждый Transition отвечают за какой то конкретный вид анимации — например Fade умеет плавно показать или скрыть View. А ChangeBounds умеет анимировать изменения размеров и положение View на экране. Особенно здорово что Transition’s отлично (ну как отлично — с определенными нюансами) работают друг с другом и могут вместе анимировать одну и ту же View.

Вообщем — изучить базовые понятия и теорию перед практикой нужно обязательно, я в свое время немало помучался с Transition-ами, и знай я сразу больше теории было бы легче. Поехали!

Как работает Transition?

Переход между A и B экранами

Итак, предположим что у нас есть изменение View. Для удобства назовем состояние View до Scene A а View после изменений — Scene B. Как здесь будет работать Transition:

  • Transition анализирует и сохраняет параметры SceneA
  • Потом Transition анализирует и сохраняет параметры SceneB
  • Интересно, что Transition сохраняет не все подряд, а только нужные ему свойства View
  • Затем на основании изменений между SceneA и SceneB Transition создает анимацию изменения.

Основные рабочие понятия Transition

Для действительно работы мастерового уровня нужно уметь пользоваться инструментом!

После теории о принципе работы Transition давайте еще немного познакомимся с основными рабочими понятиями и возможностями, которые нам предоставляет Transition. Сам класс Transition абстрактный, но он предоставляет удобный интерфейс для настройки анимации, так что эта теория точно пригодится!

Targets — точная настройка анимации

Targets — это те Views, которые будет анимировать Transition. По-умолчанию он анимирует все Views, но мы можем точно указать какие Views анимировать, а какие игнорировать. Вообще, по-умолчанию, Transition анализирует и анимирует все Views внутри ViewGroup, но поскольку корневая ViewGroup тоже View, то Transition может просто анимировать всю иерархию как одну View.

Очень удобно, что при анимации смены экрана мы можем анимировать не просто весь экран целиком, а точно настроить для каждой View как ей появится и исчезнуть с экрана.

Targets можно указывать 4 способами:

  • transitionName — строковое поле View, специально для Transition
  • ID — тот самый id View, по которому мы в мою молодость (то-бишь до Kotlinx-a) через findViewById искали вьюхи.
  • View— собственно объект View. Подходит для анимации изменений внутри одного экрана (так как одна и та же View одновременно в двух Activity находится не может)
  • Class — класс объекта. Неожиданно, но более чем дееспособно и весьма удобно. Например, если на экране множество Views одного класса, то вместо перечисления каждой View персонально можно просто через Class все одним махом добавить (или проигнорировать).

Работа с targets простая, причем редактировать targets можно как в коде так и в xml.

Пример работы с targets

Еще бонус о targets для любителей оптимизация и performance: если у нас иерархия с большим количеством Views, и мы указываем targets не всеми возможными способами, мы можем задать порядок для поиска и исключить например поиск Views по ID, если вы не указываете targets по ID. Сделать это можно через метод setMatchOrder(), в который нужно передать критерии поиска (порядок указания критериев сохраняется).

Порядок добавления учитывается, поиск будет только по добавленным

Базовые параметры анимации

Поскольку под капотом Transition создает объект класса Animator мы можем легко настроить такие базовые параметры анимации как продолжительность, задержка перед стартом и интерполятор.

Указываем эти параметры мы непосредственно классу Transition, их можно указывать как программно, в коде, так и в xml.

Пример того, как это все сделать программно.
XML. Рекомендую все же делать программно ;)

Следим за ходом анимации

И еще, очень важная функция и возможность, которую нам дает Transition (хотя, давайте честно признаем: это было бы странно если бы этого не было бы) — это возможность отслеживать ход анимации.

Методов во! Выбирай — не хочу

Думаю, что в работе с Transition, рано или поздно, но вы начнете активно использовать этот слушатель.

Резюме

Давайте подведем итог для Transition. Мы рассмотрели базовые понятия и теорию, это конечно азы и нюансов куда больше, но думаю для первого знакомства здесь более чем достаточно.

Коротко пробежимся по основным тезисам:

  • У каждого Transition есть две основные функции: сохранять свойства View и проигрывать анимацию изменений в зависимости от сохраненных свойств.
  • Своими словами работа Transition выглядит так: он «фоткает» параметры у Views в SceneA, затем «фоткает» параметры у Views SceneB и создает анимацию для перехода.
  • Можно настраивать параметры анимации: duration, startDelay и interpolator (как код так и xml)

Дополнительно:

--

--