Создаем анимацию

Статичный контент не очень интересен, особенно, если вы разрабатываете игры. Гораздо интереснее создать различные анимационные эффекты, которые привлекут внимание пользователя.

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

Ссылка на исходный код приведена в конце статьи

Разработка дизайна экрана-заставки

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

Если на таком экране-заставке вывести просто текст о названии и версии игры, а также логотип, то будет скучно. Мы пойдем по другому пути. Сделаем следующее.

  • Поместим на форму TextView для отображения верхней текстовой строки
  • Далее разместим контейнер TableLayout с двумя строками и столбцами - получается четыре ячейки
  • В каждой ячейке разместим элемент ImageView
  • Снова размещаем TextView с другой текстовй информацией
  • И снова размещаем TextView, где будет содержаться информация о версии программы

Далее добавляем ресурсы в проект: картинки (res/drawable), цвета для текстовой информации (colors.xml), размеры для шрифтов (dimens.xml).

В итоге мы получим следующий результат

Создание анимации

Создание анимации

Будем использовать анимацию преобразований. Создаем папку res/anim, в котором создаем три новых файла fade_in.xml, fade_in2.xml и custom_anim.xml.

В первом файле анимация плавно увеличивает непрозрачность (альфа-канал) верхнего текста от значения 0 (прозрачный) до значения 1 (непрозрачный) в течение 2.5 секунд.

Во втором файле происходит тоже самое, только добавлен еще один атрибут startOffset. Это означает, что сначал будет задержка в течение 2.5 секунд, а только потом произойдет анимация с такой же продолжительностью. Ее мы применим к нижнему тексту. Получается, что сначала произойдет анимация верхнего текста, а потом анимация нижнего текста.

Третья анимация самая интересная. Она будет вращать картинки вокруг своей оси (rotate), а также менять их прозрачность (alpha). Причем вращаться они будут парами. Сначала будут вращаться левые две картинки, а затем - правые. Кроме вращения и изменения прозрачности, также будет меняться их размеры (scale).

Управление анимации происходит программным путем. Чтобы применить первую анимацию к верхнему тексту, нужно получить экземпляр элемента TextView в методе onCreate, загрузить анимационный ресурс в объект Animation и вызвать метод startAnimation() элемента TextView.


TextView logo1 = (TextView) findViewById(R.id.TextViewTopTitle);
        
Animation fade1 = AnimationUtils.loadAnimation(this, R.anim.fade_in);
logo1.startAnimation(fade1);

Аналогично поступаем и со вторым текстовым элементом.

Чтобы остановить анимацию, например, в методе onPause(), нужно вызвать метод clearAnimation().

Анимация всех элементов в элементе-контейнере

Помимо возможности применения анимации к отдельным элементам, вы можете применить анимацию к каждому элементу View, содержащему в элементе-контейнере (например, TableLayout и к каждому элементу TableRow), используя класс LayoutAnimationController.

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


Animation spinin = AnimationUtils.loadAnimation(this, R.anim.custom_anim);
LayoutAnimationController controller = new LayoutAnimationController(spinin);
TableLayout table = (TableLayout)findViewById(R.id.TableLayout01);
for (int i = 0; i < table.getChildCount(); i++){
	TableRow row = (TableRow)table.getChildAt(i);
	row.setLayoutAnimation(controller);
}

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

Если после второй строчки вставить метод setOrder(), то анимация пар картинок будет происходить в случайном порядке:


controller.setOrder(2);

Скачать исходный код