Анимация в Android: переходы, ч. 1

Если у вас уже есть опыт разработки приложений для Android, вероятно, вы уже устали использовать findViewById, чтобы восстанавливать view. Или, может быть, вы уже сдались и начали использовать известную библиотеку ― Butterknife. Если это ваш случай, то вы влюбитесь в Kotlin Android Extensions.

Практическое применение

Для начала нужно включить отображение Transitions, либо в стилях:

либо в самой активити:

Далее необходимо задать эффекты (типы Transition). Опишу самые распространенные:

— ChangeBounds: отвечает за изменение координат и размеров элементов внутри лэйаута;

— Fade: плавное появление () или исчезновение () элемента;

— Slide: позволяет элементу «выезжать» (или «прибегать») из-за выбранного края;

— ChangeImageTransform: анимирует матричный переход изображения внутри ImageView. C помощью него можно плавно менять размер изображения и scaleType;

— ChangeClipBounds: анимирует изменение параметра clipBounds у элементов;

-AutoTransition: Set of effects changeBouns, , It’s used by default.

Кроме этого всегда можно написать свой собственный Transition, который не будет иметь ничего общего с вышеперечисленными.

Я решил повторить эффект с рисунка 2 (ниже). В моем случае понадобились эффекты changeBounds и changeImageTransform.

Далее верстаем два лэйаута (layout). У view, которые будут подвергнуты анимации, необходимо задать параметр transitionName, он задается на обоих лэйаутах одинаковый, тем самым обозначаются начальная и конечная сцены.

После этого в следующее активити (activity) нужно передать какие-то данные, которые будут отображаться, а также параметры для воспроизведения анимации — ActivityOptions.

{ startActivity(Intent(this, ImageActivity::).putExtra("photo", ), (this, iv1, "photo").toBundle()) }

Как можно увидеть из примера кода, в качестве параметров принимается transitionName и view.

Совсем забыл про эффекты. В ресурсах нужно добавить директорию transition, там создать transitionSet и прописать эффекты, которые вам нужны.

Далее возвращаемся в стили и прописываем transitionSet для анимации входа в активити и выхода из активити.

Конечно же, можно использовать разные наборы, я использовал одинаковые.

Самое время посмотреть, для чего всё это делалось.

Читайте также:  Play Market: установить легко, пользоваться приятно

Выглядит неплохо, при том, что мы вообще не думали про жизненный цикл активити. Пойдем дальше: провернем такой же эффект, только уже с холдером recyclerView. Всё абсолютно так же, как и в предыдущем случае: задаем одинаковый transitionName у элементов холдера и у элементов целевого активити (target activity / result activity).

Напишем простенький адаптер с колбэком (callback), который по клику на холдер (holder) будет возвращать какие-то данные для следующего активити, а также вью, которые участвуют в анимации. Так как в этом случае я задал 2 view для анимации, воспользуемся перегрузкой функции makeSceneTransitionAnimation, которая принимает в себя переменный массив элементов Pair<View, String>, соответственно, каждый такой элемент передает view и привязанный к нему TransitionName.

Запускаем…

Очень даже хорошо, а главное написания этой статьи я использовал информацию с поста на Habr: , оттуда же примеры анимаций в начале статьи.

Также изучил официальную документацию на портале разработчиков Google: -activity.

Спасибо за внимание!

Больше статей в нашем блоге:

BytePace — Блог BytePace — в темпе инноваций. Мобильные приложения для небольших, средних и крупных компаний — от…

Макет LinearLayout в Android

  • Макет LinearLayout в Android группирует элементы в одну линию. В разметке макета указываем атрибут android:orientation, который определяет тип размещения: по вертикали или по горизонтали. По умолчанию стоит значение по горизонтали.
  • Значение «по вертикали» в LinearLayout означает только один дочерний элемент в строке, а «по горизонтали» означает одну сплошную строку элементов на экране.
  • Атрибут android:layout_weight указывает важность элемента. Элемент с большим весом занимает больше места на экране.

Создание Activity на Kotlin

В Android Studio нажмите правой кнопкой мыши на имени вашего пакета и выберите New > Kotlin File.

В диалоговом окне, введите имя новой Activity и выберите Class из выпадающего списка. Я назвал свой класс MainActivity.

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

В алерте нажмте на ссылку и во всплывающем окне нажмите OK для выбора значений по умолчанию.

Для настройки поддержки Kotlin в вашем проекте, плагин Kotlin сделает некоторые изменения в файле . Примените изменения настроек нажатием на кнопку Sync Now сверху.

Создание Activity на Kotlin

На этом шаге настройка проекта завершена. Вернитесь к вашему Kotlin-классу для начала кодинга.

Читайте также:  Как скачивать приложения из американского App Store в любом регионе

Примеры использования Coroutines Kotlin

Поддержка корутин встроена в Kotlin, но все классы и интерфейсы находятся в отдельной библиотеке. Для их использования нужно добавить зависимость в gradle:

dependencies { implementation ‘:kotlinx-coroutines-core:1.0.1’ implementation ‘:kotlinx-coroutines-android:1.0.1’ }

Небольшой пример использования:

val job: Job = () { longRunningMethod() }

Разберемся, что тут происходит.

longRunningMethod() — метод, который нам нужно выполнить асинхронно.

GlobalScope — жизненные рамки для корутины. В данном случае корутина будет жить, пока живо приложение, в котором она запущена. GlobalScope — конкретная реализация интерфейса CoroutineScope. Можно реализовать свой scope, например, в Activity, и это приведет к тому, что запущенные в Activity корутины будут автоматически отменяться в случае завершения или краша Activity.

launch — метод для асинхронного запуска корутины. Соответственно, метод longRunningMethod() запустится сразу же. Метод возвращает экземпляр класса Job. Этот объект можно использовать для того, чтобы, например, отменить корутину — (). Альтернатива — метод asunc(). Он вернет Deferred<T> — отложенную корутину, которую можно запустить позднее.

— один из параметров метода launch(). Здесь указывается диспетчер для созданной корутины. Конкретно диспетчер используется для фоновых задач, не блокирующих основной поток. Если указать , то корутина будет выполняться в основном потоке.

Что имеем в итоге? Простой метод запуска асинхронного кода. Но в этом кусочке кода есть скрытые преимущества, которые не видны на первый взгляд:

  • корутины легковесны. Аналогичный код с созданием и запуском потока потребует много больше памяти:

thread { longRunningMethod() }

Корутины же мы можем создавать тысячами;

  • корутину можно приостановить. Метод delay(timeout) приостановит выполнение корутины, но это никак не отразится на потоке, в котором она выполняется;
  • в отличие от RxJava, для написания асинхронного кода не надо заучивать массу операторов типа merge, zip, andThen map, flatMap и т.д. Можно просто писать код, который будет запущен асинхронно, используя минимум дополнительных методов. Для реализации более сложной логики можно применять уже знакомые языковые конструкции, такие как foreach, repeat, filter и т.д.
Читайте также:  Зачем покупать Smartwatch – выбираем смарт-часы или смарт-браслет

Выбор функции

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

Функция Обращение к объекту Возвращаемое значение Является функцией-расширением
let it Результат лямбды Да
run this Результат лямбды Да
run Результат лямбды Нет: может быть вызвана без контекстного объекта
with this Результат лямбды Нет: принимает контекстный объект в качестве аргумента.
apply this Контекстный объект Да
also it Контекстный объект Да

Краткое руководство по выбору функции области видимости в зависимости от предполагаемого назначения:

  • Выполнение лямбды для non-null объектов: let
  • Представление переменной в виде выражения со своей локальной областью видимости: let
  • Настройка объекта: apply
  • Настройка объекта и вычисление результата: run
  • Выполнение операций, для которых требуется выражение: run без расширения
  • Применение дополнительных значений: also
  • Группировка всех функций, вызываемых для объекта: with

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

Несмотря на то, что функции области видимости предназначены для того, чтобы сделать код более кратким, избегайте их чрезмерного использования: это может снизить читабельность кода и привести к ошибкам. Избегайте вложенности функций и будьте осторожны при их объединении: можно легко запутаться в текущем значении контекстного объекта и в значениях this или it.

Заключение

Вы увидели, как легко работать с Android views в Kotlin. Благодаря простому плагину, можно забыть обо всём этом ужасном коде, связанном с восстановлением view. Этот плагин создаёт для нас необходимые свойства с приведением правильного типа, безо всяких проблем.

Кроме того, Kotlin 1.1.4 добавляет интересные фичи, которые будут действительно полезны в некоторых случаях, к которым плагин ранее не имел отношения.

Перевод статьи Antonio Leiva : Kotlin Android Extensions: The definitive guide