Подтвердить что ты не робот

Android: анимированные пользовательские представления

РЕДАКТИРОВАТЬ: сумма ответов

Я нашел 5 способов анимации в Android:

  • Анимируйте свойства View с Property Animation, чтобы плавно изменить rotation, alpha, scale и т.д.

  • Анимация кадров (AnimationDrawable): быстро меняйте фотографии, чтобы они выглядели анимированный

  • Создайте изображения с векторами (VectorDrawable) и анимация их редактируя их со временем AnimatedVectorDrawable.

  • Переопределить onDraw() на View и выполнить Пользовательский чертеж, покрасив в холст.

  • Используйте Lottie, что воспроизводит анимацию After Effects. Многие анимации доступны в LottieFiles.

Тем не менее, Android предоставляет некоторые встроенные инструменты, например Scenes (который позволяет вам анимировать переход между несколькими макетами, разделяющими Views), Shared elements (это позволяет вам выполнить прохождение View от одного Activity к другому) и т.д.

Многие (если не все) из этих функций были добавлены в API 21, нажмите здесь здесь для получения дополнительной информации.

Вот несколько интересных статей/блогов по анимации:

Наконец, несколько интересных инструментов:

  • Инструмент Mac для записи экрана Android на GitHub.

  • Видео в конвертер GIF онлайн.


Примечание

Я знаю, что Android предоставляет такие преобразования, как scale, alpha, rotate, translation и т.д.

Примеры

Есть два примера, которые я хотел бы посмотреть и сравнить.

1 - анимация пользовательского просмотра

Например, заполнение стакана воды или рисунок путь.

2 - анимация комплексного просмотра

Например, приложение StackExchange для Android, анимация экрана входа в систему (не удалось найти видео на нем, также не проверял, ведет ли он себя в iOS).

Вопрос

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

Я не думаю, что это так, поэтому я хотел бы спросить: (1) вы знаете, как это делается?

Что касается второго примера, мне пришла в голову только одна идея и установка Path и перемещение View соответственно, передав ее как-то после animate(). (2) Возможно ли это?

Помимо упомянутого выше, (3) знаете ли вы другие методы воспроизведения анимаций? (Например, Scene transitions - упомянутый в ответе -)

Пожалуйста, поделитесь! Спасибо.

4b9b3361

Ответ 1

"Заполнение стакана воды" анимация - это прямое представление о реализации через анимацию кадра, то есть изменение изображений один за другим. Здесь вы можете видеть хорошее сообщение в блоге, описывающее, как реализовать такую ​​анимацию, которая в основном такая же, как "заполнение стакана воды", вы упомянули:

введите описание изображения здесь

Другая анимация выглядит с трудом на первый взгляд.

введите описание изображения здесь

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

// assuming at this step all the views are at the initial position at x0, y0
TransitionManager.beginDelayedTransition(rootLayout);
// here set view coordinates to x1, y1 - the final position

Структура переходов сделает для вас все остальное. Он найдет дельту и сделает анимацию для вас. Здесь вы найдете хорошую статью Lucas Rocha.

Ответ 2

Знаете ли вы о других методах воспроизведения анимаций?

В Android у вас есть 3 способа реализации анимации:

  • Анимируйте вид (масштаб, альфа, поворот и т.д.), просто используя view.startAnimation(...)
  • Анимировать Drawable (в зависимости от Drawable, это может быть что угодно: от анимационных векторных чертежей до анимация кадров)
  • Выполнение пользовательского рисования и анимации

Очевидно, что просто анимация представления с помощью методов framework проще, чем создание какой-либо привлекательной анимации, а создание некоторого drawable (xml) проще, чем выполнение пользовательского чертежа.

Вы упомянули lottie, который только что вышел несколько дней назад. Мы посмотрим, как это хорошо, но выглядит очень многообещающим. Под капотом лотти проанализирует json и выполнит собственный рисунок с использованием Canvas и Path (3-я маркерная точка выше)
Если вы можете получить After Effects, это, вероятно, "самое простое" решение для сложных анимаций (и кросс-платформу!)

Люди также начали делиться анимацией, вы можете найти их здесь:
http://www.lottiefiles.com/


Вы знаете, как это сделано?

Видео (1) выглядит так, как будто они делают какой-то пользовательский рисунок.

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

Это будет связано с созданием пользовательского представления и/или вытягивания и переопределения onDraw(Canvas) Path.lineTo, а также некоторые дуги, кубики или квадраты сделают трюк... Я не разработчик и не специалист по вектору: )

Я не думаю, что этого можно было легко достичь, используя анимированные векторные чертежи, но вы можете сделать это, применив анимацию морфинга пути, (Анимированные векторные чертежи поддерживаются только на 21+, если я не ошибаюсь)

Видео (2) просто анимирует Path и виляет флаг. Это может быть достигнуто с помощью AnimatedVectorDrawables (например, этот блог) и обрезание путей начинается/заканчивается или снова, выполняя собственный рисунок (и, таким образом, также поддерживающие устройства до лолипопа) путем анимации Пути, например используя PathMeasure.getSegment() для непрерывного анимации пути.

Анимация (3), о которой уже говорила azizbekians answer, является первым упомянутым видом, просто анимацией (перемещением и масштабированием).


Что касается второго примера, мне пришла в голову только одна идея и установление Пути и перемещение представления соответственно, передав его каким-то образом после animate(). (2) Возможно ли это?

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

Ответ 3

Я хотел бы предложить библиотеку, которую я написал некоторое время назад (недавно опубликованную), которая позволяет создавать пользовательские представления и добавлять к ним анимации.

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

Он работает с Android TimeInterpolator и любым его дочерним узлом (как и пользовательские).

Анимации полностью рисуются с использованием Canvas, разница в том, что вы можете получить анимированное значение, которое изменяется в соответствии с TimeInterpolator как функция времени.

Вы можете добавить столько анимаций, сколько хотите, в свой просмотр, контролируете их независимо друг от друга. И вдобавок ко всему, вы не ограничиваетесь рисованием не-анимационных вещей. Там специальный метод для этого (onDrawStatics).

Ответ 4

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

Скажем, ClockView, You После установки краски, штриха и т.д. в OnDraw()

Возможно, вы захотите использовать AsyncMethods/Runnables, который постоянно обновляет свойства в фоновом режиме, что приводит к анимации Frame by Frame, но это не Fraame Animation на самом деле, потому что вы анимируете только свойства представления (повернуть налево), а не он рамка для тентонов

Здесь есть десятки примеров, с небольшим количеством поисковых запросов вы можете сделать DIY