Different animations in android

Анимация в android — разбираемся в зоопарке.

Введение

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

Также стоит взглянуть на инструменты для дизайнеров(типа After effects или Photoshop), и сразу становится понятно, что силы неравны. У них все визуально, с кучей слоев, и встроенных фильтров, каждый из которых может добавить сотню кастомизаций, которые нам придется делать вручную через код. Поэтому стоит всегда понимать, какие сложности могут возникнуть в процессе и объяснять менеджерам что вы здесь в разных весовых категориях с дизайнером и какая-то простая анимация может увеличить срок разработки на недели. Если же найти компромисс не получилось, хорошо бы разобраться с тем, что у нас есть, и когда что можно использовать.

Зоопарк анимаций в андроид

Animation package

Animation — существует с момента запуска андроид. Так как производительность низкая, никто особо не парился с его удобством. Меняет представление об объекте, а не сам объект. В основном, методы работают через передачу параметров времени и объекта Transformation, который определяет как мы хотим изменить нашу вью. Мы можем изменить только поля предоставленные фреймворком: прозрачность, позиция, поворот, размер. Но не можем к примеру изменить фон картинки с помощью анимации, так как мы ограничены теми видами анимаций, которые нам предоставлены. Хотя цвет в андроид это тип Int, поэтому мы можем плавно изменить его с помощью ValueAnimator-ов, например.

Иерархия классов Animation

  1. AlphaAnimation — показать/спрятать
  2. TranslateAnimation — позиция(передвижение)
  3. RotateAnimation — поворот
  4. ScaleAnimation — меняет размер
  5. AnimationSet — набор из нескольких анимаций

Animator

Animator — появился в 3 версии андроид. Более удобный и универсальный, чем Animation. Меняет свойства самого объекта View, которые находятся в классе View.Property. С помощью него, можно анимировать что угодно и как угодно. Он и будет основной темой этой презентации.

Иерархия классов Animator

  1. AnimatorSet — если нужно воспроизвести анимации в определенном порядке. Позволяет комбинировать различные анимации. Регулировать их порядок с помощью паттерна Builder и методов play(), before(), after(). Воспроизводить их параллельно или последовательно с помощью методов playSequently(), playTogether().
  2. ValueAnimator — содержит внутри себя набор различных анимаций. Задается Property и то, как мы хотим его изменить. После этого в методе onAnimationUpdate обновляем UI в зависимости от изменения property.
  3. ObjectAnimator:ValueAnimator — создан для упрощения ValueAnimator. Все то же самое, но синтаксис проще. Большой кусок кода заменяется методом onFloat() принимающим необходимые параметры. Внутри него мы можем изменить View.Property, причем не вручную, ObjectAnimator сделает это за нас. Это ему помогает сделать набор классов Evaluator-ов.
  4. ViewPropertyAnimator — еще один класс(не наследник Animator), но принцип работы похожий. Для анимации используется метод View.animate(), который возвращает билдер класса ViewPropertyAnimator.
Читайте также:  Автовключение экрана андроид при поднятии

Animator vs Animation

Яркий пример, что можно сделать с помощью Animator и нельзя с помощью Animation. С помощью Animation мы не можем постепенно изменить фон, так как этого нет в стандартных анимациях. А с помощью Animator — пожалуйста. Ведь фон представлен числовым значением, которое можно постепенно превратить из одного в другое.

FragmentAnim, Animation, Animator

Надстройкой над другими стоит класс FragmentAnim, который под капотом решает, какой пакет ему использовать для анимации Animation или Animator в зависимости от версии и подхода, который решил использовать разработчик. Прикол в том, что мы можем передать туда анимации только через xml. И синтаксис будет одинаковым, отличаться будут только package для xml. Что накладывает некоторые ограничения. Например, если я хочу сделать анимацию чтобы пользователь нажимал на кнопку, и фрагмент расширялся из кнопки на весь экран, это нельзя сделать с помощью стандартного сета анимаций. Кнопки может изменить местоположение и наш фрагмент будет выскакивать совсем не из того места, откуда я хочу.

Как это сделать:

Если вкратце, то мы можем пошарить вью между классом который его создает и фрагментом. Применив Transition framework мы сможем преобразовать нашу вью из одного экрана в другую вью на новом экране, используя атрибут transitionName. Есть ограничение по версии.

Transition framework

Transition Framework работает только для Android 4.4 и выше. Этот фреймворк вводит такие понятия, как Transition, который в свою очередь, включает в себя целый класс анимаций(Slide, Fade, Explode). Названия говорят сами за себя и представляют именно ту анимацию, которая находится в их имени. Можно писать анимации, как в xml, так и в самом коде. Его суть заключается в том, что у нас есть две сцены, и мы можем переключиться между ними с помощью объекта Transition. Далее, все изменения родителя будут анимированы указанным способом.
https://developer.android.com/training/transitions
https://www.youtube.com/watch?v=B2jZ439bytI&ab_channel=Smartherd

FragmentAnim и Transition framework

Используется для анимации между фрагментами

Может использоваться Animation и Animator, которые будут задаваться через xml

В классе FragmentTransaction метод addSharedElement() и с помощью Transition мы можем шарить один элемент между фрагментами — не в плане использования, а в плане UI

Interpolator

Interpolator:TimeInterpolator — класс, который отвечает за то, что вью переходит из одного состояния в другое. Animator знает 2 состояния, в которых находится вью в начале и в конце анимации, а Interpolator отвечает за разбиение трансформации из одного состояния в другое на маленькие изменения, чтобы анимация проходила плавно. Основные подклассы:

  1. LinearInterpolator
  2. BounceInterpolator
  3. CircleInterpolator
  4. PathInterpolator
  5. AccelerateInterpolator

AnimationDrawable

Это анимация, которую мы задаем непосредственно в xml с помощью animation-list. С помощью нее удобно изменять вид imageView. Например, мы хотим сделать аналог gif-картинки, которая пару секунд будет показывать одну картинку, пару секунд другую и так далее. Причем, это будет работать с нашими android swg файлами, и не будет есть столько памяти, как gif-ка.

Читайте также:  Recovery mode any android

MotionLayout и MotionScene

ConstraintSet

ConstrantLayout и ConstraintSet. Для этого подхода мы создаем несколько ConstraintLayout с начальным, промежуточным и конечным положением view на layout — чаще всего хватает двух. После этого, они добавляются в ConstraintSet и с помощью класса TransitionManager(из выше упомянутого фреймворка Transition) и его метода beginDelayedTransition() выполняется анимация между этими двумя состояниями.

MotionLayout

ConstraintLayout и MotionLayout — это то, к чему сейчас переходит вся андроид анимация. Внутри самого MotionLayout xml не происходит никакая анимация, по сути это тот же ConstraintLayout, в котором мы создаем наши обычные вью. Единственное, как он связан с анимацией, это ссылкой на MotionScene в LayoutDescription. Внутри MotionScene и задаются необходимые нам Constraint-ы, а также Transition, с помощью которого мы можем добавлять ключевые кадры. В целом, подход довольно интересный, но у меня не получилось его как следует разобрать из за того, что студия отказывается скачивать документацию для классов из этой библиотеки.

Источник

Using animations in Android application — Tutorial

Android Property Animation API. This tutorial describes how to use the animation API in Android.

1. Android Animations

1.1. Using animations

Android allows changing object properties over a certain time interval via the properties animation API.

The superclass of the animation API is the Animator class. The ObjectAnimator class can be used to modify attributes of an object.

You can also add an AnimatorListener class to your Animator class. This listener is called in the different phases of the animation. You can use this listener to perform actions before or after a certain animation, e.g. add or remove a View from a ViewGroup .

The animate() method on a View object returns an ViewPropertyAnimator object for the view. It provides a fluent API to typical animations which can be performed on views.

The following code shows an example.

You can also register action, which are executed before the start or after the end of the animation.

1.2. Define the rate of change for an animation

Via the setInterpolator() method you register an TimeInterpolator object with an animation. It defines the rate of change for an animation.

The standard is linear. The Android platform defines a few default ones. For example, the AccelerateDecelerateInterpolator class defines that the animation starts and ends slowly but accelerates through the middle.

1.3. Using animations with arbitrary properties

The animation system cannot automatically understand every type. Via the setEvaluator method you can set an object of type TypeEvaluator . It allows creating animations for arbitrary types, by providing custom evaluators for these types.

1.4. Layout animations

The LayoutTransition class allows setting animations on a layout container and a change on the view hierarchy of this container will be animated.

1.5. Animations for Activity transition

Animations can be applied to Views but it is also possible to apply them on the transition between activities.

The ActivityOptions class allows defining defaults or customer animations.

2. Android Basics

The following description assumes that you have already basic knowledge in Android development.

Please check https://www.vogella.com/tutorials/Android/article.html — Android development tutorial, to learn the basics. Also see https://www.vogella.com/android.html — Android development tutorials, for more information about Android development.

3. Exercise: Using the properties animations API

This exercise demonstrates the usage of the Properties animation API.

Читайте также:  Как извлечь удаленные файлы андроид

Create a new Android project with the top level package name com.vogella.android.animation.views and an activity called AnimationExampleActivity. The layout file should be called activity_main.xml.

Change your layout file to the following code.

Create the following menu resource.

Change your activity similar to the following listing.

Create a new xml layout file called target like the following.

Create a new HitActivity activity.

If you run this example and press the different buttons, the animation should start. Via the toolbar, you can start your HitActivity .

4. Activity animations in Android with shared views

Android 5.0 adds the capability to animate between activities and to have shared views between these activity. If you define a shared part the old view with be animating into the position and size of the new view.

To test this create a project with the top level package called com.vogella.android.activityanimationwithsharedviews .

Create two activity with two different layout, both containing a ImageView with the same android:transitionName property.

Источник

Анимации в Android по полочкам (Часть 3. «Низкоуровневые» анимации)

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

Часть 3. «Низкоуровневые» анимации

1. Рисование на канвасе View

Первый способ который мы рассмотрим это рисование в методе onDraw нашего объекта View . Реализуется данный способ просто, достаточно переопределить onDraw и в конце вызвать postInvalidateOnAnimation() .

В данном примере наш drawable будет перемещаться по оси x.

Пример со снежинками выше будет занимать несколько больше кода, т.к. нам нужно хранить состояние каждой отдельной снежинки отдельно.

  • Случаи в которых легче нарисовать анимацию программно

Достоинства:

  • Можно создавать анимации зависящие абсолютно от любых параметров
  • Нет лишних затрат на объекты View

Недостатки:

  • Расчёты анимации и отрисовка происходят в UI thread

2. Рисование на канвасе SurfaceView

Что если расчёт следующего шага анимации будет занимать значительное время? Мы всё ещё можем воспользоваться первым способом и вынести расчёты в отдельный поток. Но это всё равно не приведёт к 100% плавности в анимации т.к. UI thread может быть загружен ещё чем либо помимо нашей анимации.

Android позволяет отвязаться от основного цикла(main loop) отрисовки с помощью компонента SurfaceView . А раз мы больше не привязаны к основному циклу, то нам придётся держать свой поток для расчётов и отрисовки. SurfaceView предоставляет коллбэки в которых мы можем запустить и остановить наш поток. В потоке по окончанию расчётов мы будем отрисовывать нашу анимацию.

Реализация той же анимации снежинок будет выглядеть следующим образом:

  • Случаи в которых легче нарисовать анимацию программно
  • Игры

Достоинства:

  • Можно создавать анимации зависящие абсолютно от любых параметров
  • Нет лишних затрат на объекты View

Недостатки:

3. OpenGL


Точно также, как и на канвасе, мы можем рисовать используя OpenGL API. Если вы задумали что-либо сложнее чем куб на картинке, то стоит посмотреть в сторону какого-либо движка, например libgdx. К сожалению, даже базовый пример займёт здесь довольно много места, поэтому ограничимся только этим кратким превью.

  • Высокая производительность и управление памятью, шейдеры

Недостатки:

Источник

Оцените статью