Главная » Разработка для Android » Анимация в Android приложении

0

 

В инструментарии пользовательского интерфейса Android есть еще средства для выполнения анимации. Анимации перехода (называемые в документации Google tweened animations, анимациями с расчетом промежуточных кадров) представляют собой подклассы android. View. animatіon. Animation: RotateAnimation, Transl ateAnimation, ScaleAnimation и т. д. Такие анимации используются при переходах между двумя парами видов. Анимация второго типа – подклассы от android, graphics, Drawable. Ani mationDrawable. Ani mationDrawable – может размещаться на фоне любого виджета и позволяет создавать самые разнообразные эффекты. Наконец, имеется полнофункциональный класс на основе SurfaceView, который позволит вам полностью контролировать вашу собственную анимацию, создаваемую «по наитию».

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

Анимация переходов

Анимация переходов начинается с вызова метода startAnimation класса View с экземпляром Animation в качестве параметра (или, разумеется, вашего собственного подкласса). После установки анимация проигрывается вплоть до завершения – у анимации перехода нет состояния паузы.

Центральный элемент анимации – метод applyTransformation. Он вызывается для генерации последовательных кадров анимации. В примере 9.12 показана реализация одного преобразования. Как видите, для анимации не генерируются цельные графические кадры. Вместо этого генерируются последовательные преобразования, которые будут применяться к анимируемому изображению. Как вы помните из пункта «Матричные преобразования» выше, такие преобразования используются для того, чтобы объект как будто двигался. Анимации перехода основаны именно на таком приеме.

Пример 9.12. Анимация перехода

При применении данной конкретной реализации к объекту создается впечатление, как будто объект крутится в плоскости экрана (вызов метода rotate) и в то же время исчезает вдали (вызов метода translate). Матрицу, которая будет применяться к целевому изображению, мы получаем от объекта Transformation, который был передан при вызове.

Данная реализация использует camera, экземпляр вспомогательного класса Camera. Класс Camera никак не связан с той камерой, которая установлена в телефоне, – это вспомогательный класс, который позволяет записывать состояние изображения. Здесь он используется для составления преобразований вращения и перехода в единой матрице, которая затем сохраняется в виде анимации перехода.

Первый параметр, сообщаемый applyTransformation, называется t. Фактически это номер кадра. Он передается как число с плавающей точкой в диапазоне от 0,0 до 1,0. Это число можно охарактеризовать и как процентный показатель того, насколько завершена анимация. В этом примере t используется для увеличения видимого расстояния до анимируемого объекта по оси Z (это линия, перпендикулярная плоскости экрана) и для задания доли от полного поворота, то есть для указания, насколько повернулось изображение. При увеличении t кажется, что анимируемое изображение вращается все дальше от нас против часовой стрелки, причем отдаляется от нас по оси Z.

Операции preTranslate и postTranslate необходимы для того, чтобы переходы изображения происходили вокруг центра этого изображения. По умолчанию матричные операции преобразуют объект, изменяя его относительно начала координат (верхнего левого угла). Если бы мы не обрамили наши преобразования в preTranslate и postTranslate, то казалось бы, что целевое изображение вращается вокруг своего левого верхнего угла. Фактически preTranslate перемещает начало координат к центру анимации, которая должна получиться после операции перехода, a postTranslate приводит к восстановлению координат после завершения перехода.

Если подумать о том, что именно должна делать анимация перехода, то становится понятно, что она фактически должна как будто совмещать две анимации: анимация с предыдущего кадра должна затухать, а анимация со следующего – нарастать. В примере 9.12 именно так применяется последняя переменная, которую мы еще не объяснили, – dir. Ее значение может быть равно 1 или -1. Она определяет, когда анимированное изображение как будто сжимается, а когда – постепенно увеличивается, выходя на передний план. Нам нужно просто найти способ, чтобы объединить процессы сжатия и разрастания в одну анимацию.

Для этого применяется уже знакомый вам паттерн со слушателем Listener. Класс Animation определяет слушатель, называемый Animation.AnimationListener. Любой экземпляр Anitnation, обладающий ненулевым слушателем, вызывает этот слушатель один раз при запуске, один раз при остановке и по разу для каждой итерации между началом и завершением этого процесса. Слушатель, замечающий, что анимация сжатия завершается, должен порождать новую анимацию, при которой изображение разрастается. Тогда вы достигнете требуемого эффекта. В примере 9.13 показана оставшаяся часть реализации этой анимации.

Пример 9.13. Состав анимации перехода

Переход начинается с метода runAnimation. Переопределенный метод onAnimationEnd, относящийся к AnimationListener, порождает вторую половину процесса. Данный метод вызывается, когда целевое изображение кажется слишком отдаленным. Тогда он скрывает изображение, анимируемое в настоящий момент (curView), и заменяет его новым видимым изображением – next View. Затем он создает новую анимацию, которая проигрывается в обратном порядке и заставляет новое изображение вращаться и увеличиваться, выступая на передний план.

Класс Interpolator – это пример замечательного внимания к деталям. Значения для t, сообщаемые applyTransformation, могут распределяться во времени и нелинейно. В данной реализации анимация, близящаяся к завершению, ускоряется, а потом, когда на передний план выступает новое изображение, снова замедляется. Такой эффект достигается благодаря применению двух интерполяторов: Acceleratelnterpolator для первой части анимации и Deceleratelnterpolator – для второй части. Без интерполятора разница между последовательными значениями t, передаваемыми applyTransformation, была бы постоянной. В таком случае казалось бы, что анимация протекает с постоянной скоростью. Acceleratelnterpolator преобразует эти равномерно распределенные значения t в такие значения, которые располагаются сравнительно близко друг к другу в начале анимации и гораздо дальше друг от друга – в конце анимации. Благодаря этому кажется, что анимация ускоряется. Decel eratelnterpol ator создает прямо противоположный эффект. Кроме того, в Android для особых случаев предоставляются еще два интерполятора: Cyclelnterpolator и Linearlnterpolator.

Функция объединения анимационных процессов встроена в инструментарий при помощи класса со слегка смущающим названием AnimationSet. В этом классе предоставляется удобный механизм составления списка (не множества). Этот Список упорядоченный, и отдельно взятая анимация может входить в него несколько раз. Таким образом, список составляется из анимаций, которые должны проигрываться в определенном порядке. Кроме того, инструментарий предлагает несколько стандартных вариантов перехода: AlphaAnimation, RotateAnimation, SealeAnimation и TranslateAnimation. Разумеется, такие анимации перехода не обязательно должны быть симметричными, как в предыдущем примере. Новое изображение может постепенно проступать, оставаясь прозрачным (эффект alpha-fade in), в то время как старое изображение будет постепенно сжиматься, уходя в угол. Или новое изображение может постепенно подниматься снизу экрана, пока старое медленно растворяется. Возможности практически безграничны.

Источник: Android. Программирование на Java для нового поколения мобильных устройств

По теме:

  • Комментарии