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

Во многих Android приложениях можно встретить такой приём как просмотр изображений при помощи их перелистывания. Когда каждое из нескольких изображений располагается как бы на отдельном экране.

Обзор XML макетов (Android Layouts)

В Android основным строительным блоком пользовательского интерфейса является объект View, который по умолчанию он занимает прямоугольную область на экране. Этот объект является экземпляром одноименного класса View и базовым классом для всех компонентов пользовательского интерфейса, например: TextView, Button, EditText и другие.

Также есть класс ViewGroup, который является подклассом View. Один или несколько View могут быть сгруппированы в ViewGroup. Этот класс обеспечивает компоновку, вид и последовательность View. Примерами ViewGroup являются LinearLayout, RelativeLayout, о которых мы сегодня и поговорим.

Основные макеты в Android:

  • RelativeLayout — это ViewGroup, который определяет положение дочерних View относительно друг друга.
  • LinearLayout — это ViewGroup, который определяет расположение всех дочерних элементов: по вертикали или по горизонтали.
  • AbsoluteLayout позволяет указать точное положение дочерних View.
  • TableLayout рассматривает дочерние элементы в виде строк и столбцов.
  • GridView — разновидность ViewGroup, в котором элементы представлены в двумерной сетке  с прокруткой. Элементы в GridView попадают из назначенного экземпляра ListAdapter.
  • FrameLayout заполняет собой экран для отображения единственного View.
  • ListView — набор View, который можно скроллить (прокручивать).
  • Scrollview — разновидность FrameLayout, позволяющая просматривать элементы пользовательского интерфейса даже если они не видны на первом экране. Это происходит с помощью скроллинга (пользователь прокручивает экран для полной видимости содержимого). Scrollview может содержать только один вид дочерний View и же макет ViewGroup.

Android Layouts: атрибуты XML макета/компоновки

  • android:id — это идентификатор, который однозначно идентифицирует элемент View
  • android:layout_width — ширина макета
  • android:layout_height — высота макета
  • android:layout_margin — дополнительное пространство за пределами элемента View.
  • android:layout_padding определяет дополнительное пространство внутри элемента View.
  • android:layout_gravity определяет расположение дочернего View.
  • android:layout_weight определяет дополнительного пространства для View.
  • android:layout_x определяет координаты макета по оси Ox
  • android:layout_y определяет координаты макета по оси Oy

Атрибут android:layout_width=»wrap_content» указывает, что View должно занять ровно столько места по ширине, сколько занимает его содержимое.

Атрибут android:layout_width=»match_parent» указывает, что View должно занять ровно столько места по ширине, сколько занимает его родительский элемент.

Читайте также:  Real Car Parking 2 - скачать бесплатно симулятор парковки

В этом уроке мы рассмотрим два наиболее популярных в разработке под Android макета:

  • LinearLayout
  • RelativeLayout

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

Для начала нужно включить отображение 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 для анимации входа в активити и выхода из активити.

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

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

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

Читайте также:  Как дозвонится если включен режим «Не беспокоить»

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

Запускаем…

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Создание Activity Kotlin

В Android Studio щелкните правой кнопкой мыши имя вашего пакета и выберите « Создать»> «Файл Kotlin» .

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

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

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

Чтобы настроить ваш проект на поддержку Kotlin, плагин Kotlin вносит несколько изменений в файл . Примените эти изменения, нажав кнопку « Синхронизировать сейчас» , как показано ниже.

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

Выводы

Естественно, в одной статье невозможно раскрыть все аспекты нового инструмента в асинхронном программировании. Тем, кто заинтересовался корутинами Kotlin, можно посоветовать изучить и протестировать, к примеру, комбинирование корутин, каналы, реализацию Actor model и другие возможности.

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

Как мы видим, задачи асинхронного программирования под Android проще реализовать с помощью корутин: быстрее разработка, выше читаемость кода. Риски, конечно, тоже есть: для изучения корутин нужно некоторое время, а их возможности иногда могут не закрыть все требования задачи. Перед использованием в своем проекте рекомендуется внимательно ознакомиться с областью их применения.

Официальный сайт разработчиков Kotlin:

Анонс релиза Kotlin 1.3.0 с Coroutines: -1-3/

Видимость (Visibility)

Видимость в Kotlin представляется в Java следующим образом:

  • private элементы компилируются в private элементы;
  • private объявления верхнего уровня компилируются в локальные объявления пакетов;
  • protected остаются protected (обратите внимание, что java разрешает доступ к защищенным членам из других классов в том же пакете, а Kotlin-нет, поэтому классы Java будут иметь более широкий доступ к коду);
  • internal  объявления становятся public в JAVA. Члены internal классов проходят через искажение имен, чтобы усложнить случайное использование их из Java и позволить перегрузку для членов с одинаковыми сигнатурами, которые не видят друг друга в соответствии с правилами Kotlin;
  • public остаются public.