Android: Створюємо анімацію

  1. Хай завжди буде сонце
  2. Нехай завжди буде небо
  3. Трин-трава
  4. Збираємо фігури разом
  5. анімація сходу
  6. пишемо код
  7. анімація годин
  8. додаткове читання

Стаття проплачена кішками - всесвітньо відомими виробниками кошенят.

Якщо стаття вам сподобалася, то можете підтримати проект .

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

В Android доступні кілька видів анімації, яким відведено окремий розділ анімація . Ми розглянемо один з видів для ознайомлення.

У цьому уроці ми будемо використовувати анімацію з фігур, створивши ілюзію сходу сонця. Також додамо анімацію аналогового годинника. Буде цікаво!

Створимо новий проект під назвою "Sunrise" (Схід сонця).

Хай завжди буде сонце

Спочатку намалюємо сонце. Створимо нову папку drawable в папці res (якщо такий папки немає). Далі в створеній папці створимо новий файл sun.xml такого змісту:

<? Xml version = "1.0&quot; encoding = "utf-8"?> <Shape xmlns: android = "http://schemas.android.com/apk/res/android" android: dither = "true" android: shape = "oval"> <gradient android: endColor = "# ffff6600" android: gradientRadius = "150" android: startColor = "# ffffcc00" android: type = "radial" android: useLevel = "false" /> <size android: height = "150dp" android: width = "150dp" /> </ shape>

Для зображення сонця ми використовували фігуру Овал з однаковими розмірами, щоб отримати "сонячний круг". Щоб малюнок сонця вийшов красивим, застосуємо до нього градієнт (плавна зміна кольору) від темно-жовтого до світло-жовтого.

Нехай завжди буде небо

Далі намалюємо "небо навколо". У тій же папці drawable створимо новий файл sky.xml такого змісту:

<? Xml version = "1.0&quot; encoding = "utf-8"?> <Shape xmlns: android = "http://schemas.android.com/apk/res/android" android: dither = "true" android: shape = "rectangle"> <gradient android: angle = "90" android: endColor = "# ff000033" android: startColor = "# ff0000ff" /> </ shape>

Ми задали фігуру у вигляді прямокутника з блакитним градієнтом від нижнього краю до верхнього.

Трин-трава

Хлопчисько намалював сонце, небо і підписав в куточку чотири рядки знову про сонце, небо, а також про маму і про себе. А про кота він зовсім забув. Гаразд, не будемо звертати уваги на дурного хлопчика, а звернемося до іншої пісні, де зайці косили (!!!) трин-траву. Мабуть у автора непогана травичка була. Але слів з пісні не викинеш - намалюємо траву. Створюємо файл grass.xml в уже знайомій папці:

<? Xml version = "1.0&quot; encoding = "utf-8"?> <Shape xmlns: android = "http://schemas.android.com/apk/res/android" android: dither = "true" android: shape = "rectangle"> <gradient android: angle = "90" android: endColor = "# ff003300" android: startColor = "# ff009900" /> </ shape>

Особливо викручуватись не будемо, а намалюємо зелений прямокутник з градієнтом, тим більше я не знаю, як виглядає трава, скошена зайцями.

Збираємо фігури разом

Настав час збирати каміння, вибачте, фігури. Для початку відкриємо файл strings.xml в папці res / values і додамо кілька строкових ресурсів:

<String name = "sun"> Сонце </ string> <string name = "grass"> Трава </ string> <string name = "sky"> Небо </ string> <string name = "clock"> Годинники </ string> <string name = "hour"> Стрілка </ string>

Відкриємо розмітку головною активності activity_main.xml і додамо в неї кілька елементів ImageView:

<RelativeLayout xmlns: android = "http://schemas.android.com/apk/res/android" xmlns: tools = "http://schemas.android.com/tools" android: layout_width = "match_parent" android: layout_height = "match_parent" android: paddingBottom = "@ dimen / activity_vertical_margin" android: paddingLeft = "@ dimen / activity_horizontal_margin" android: paddingRight = "@ dimen / activity_horizontal_margin" android: paddingTop = "@ dimen / activity_vertical_margin" tools: context = ". MainActivity "> <ImageView android: id =" @ + id / sky "android: layout_width =" fill_parent "android: layout_height =" fill_parent "android: contentDescription =" @ string / sky "android: src =" @ drawable / sky " /> <ImageView android: id = "@ + id / sun" android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: layout_centerHorizontal = "true" android: contentDescription = "@ string / sun" android: scaleType = "fitCenter" android: src = "@ drawable / sun" /> <ImageView android: id = "@ + id / grass" android: layout_width = "fill_parent" android: layout_height = "150dp" android: layout_alignParentBo ttom = "true" android: contentDescription = "@ string / grass" android: src = "@ drawable / grass" /> </ RelativeLayout>

У всіх елементів ImageView в атрибуті android: src ми прописали створені фігури, які тепер можна бачити на екрані.

анімація сходу

Нагадаю, що ми збиралися робити анімацію, а не малюнок. Продовжимо урок. Потрібно, щоб сонце піднімалося в верхню частину екрана. Створимо нову папку res / anim, в якій будуть знаходитися файли анімації.

Створимо в створеній папці новий файл sun_rise.xml:

<? Xml version = "1.0&quot; encoding = "utf-8"?> <Set xmlns: android = "http://schemas.android.com/apk/res/android" android: duration = "5000" android: fillAfter = "true" android: interpolator = "@ android: anim / accelerate_decelerate_interpolator" android: shareInterpolator = "false"> <scale android: fromXScale = "1.0" android: fromYScale = "1.0" android: pivotX = "50%" android: pivotY = "50%" android: toXScale = "1.5" android: toYScale = "1.5" /> <translate android: fromYDelta = "80% p" android: toYDelta = "10% p" /> <alpha android: fromAlpha = "0.3" android: toAlpha = "1.0" /> </ set>

У блоці set ми встановили деталі анімації. Наприклад, параметр android: duration показує, що анімація повинна відбутися протягом 5 секунд. Параметр fillAfter управляє станом анімації - вона не повинна стрибати в початок. Параметр android: interpolator використовує системну константу для невеликого прискорення від початку до середини анімації і гальмування від середини до кінця анімації.

Усередині блоку set встановлюються спеціальні блоки, що відповідають за характер анімації: зміна розмірів, позиції і прозорості.

Наприклад, фігура сонця по нашим задумом буде збільшуватися від свого початкового розміру в півтора рази, роздуваючи рівномірно від своєї середини (scale).

Елемент translate рухає сонце по екрану вертикально вгору. Ми відштовхуємося щодо батьківського елементу, використовуючи суфікс "p". Сонце починає рух в позиції 80% від батьківського елемента по осі Y і закінчує рух в позиції 10%.

При русі також змінюється прозорість сонця від повної прозорості до повної непрозорості (alpha).

пишемо код

Переходимо безпосередньо до програмування.

package ru.alexanderklimov.sunrise; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.ImageView; public class MainActivity extends Activity {@Override protected void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); // Отримаємо посилання на сонці ImageView sunImageView = (ImageView) findViewById (R.id.sun); // Анімація для сходу сонця Animation sunRiseAnimation = AnimationUtils.loadAnimation (this, R.anim.sun_rise); // Підключаємо анімацію до потрібного View sunImageView.startAnimation (sunRiseAnimation); }}

Запускаємо проект і милуємося сходом сонця.

анімація годин

Додамо до проекту годинник з анімацією. Створимо в папці res / drawable файл clock.xml:

<? Xml version = "1.0&quot; encoding = "utf-8"?> <Layer-list xmlns: android = "http://schemas.android.com/apk/res/android"> <item> <shape android: dither = "true" android: shape = "oval"> <gradient android: endColor = "# ffffffff" android: gradientRadius = "100" android: startColor = "# 66ffffff" android: type = "radial" android: useLevel = " false "/> <size android: height =" 100dp "android: width =" 100dp "/> <stroke android: width =" 2dp "android: color =" # 99000000 "/> </ shape> </ item> < item android: bottom = "44dp" android: left = "48dp" android: right = "48dp" android: top = "5dp"> <shape android: shape = "rectangle"> <solid android: color = "# 99000000" /> </ shape> </ item> </ layer-list>

Створимо в папці res / anim файл clock_turn.xml для анімації годин:

<? Xml version = "1.0&quot; encoding = "utf-8"?> <Set xmlns: android = "http://schemas.android.com/apk/res/android" android: duration = "5000" android: fillAfter = "true" android: interpolator = "@ android: anim / linear_interpolator" android: shareInterpolator = "false"> <rotate android: fromDegrees = "0" android: pivotX = "50%" android: pivotY = "50%" android : toDegrees = "720" /> </ set>

В анімації ми вказали значення 720 градусів, щоб годинник зробили повний оборот два рази. Хоча обертається вся фігура, для користувача буде здаватися, що обертається тільки стрілка.

Додамо в розмітку новий ImageView для годин:

<ImageView android: id = "@ + id / clock" android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: layout_alignParentBottom = "true" android: layout_alignParentRight = "true" android: contentDescription = "@ string / clock "android: padding =" 10dp "android: src =" @ drawable / clock "/>

Тепер необхідно додати код для анімації годин:

// Отримаємо посилання на годинник ImageView clockImageView = (ImageView) findViewById (R.id.clock); // анімація для обертання годин Animation clockTurnAnimation = AnimationUtils.loadAnimation (this, R.anim.clock_turn); clockImageView.startAnimation (clockTurnAnimation);

Запустіть проект, щоб перевірити, що все працює.

Зараз у годин одна хвилинна стрілка. Давайте додамо ще годинникову стрілку. Створюємо файл hour_hand.xml в папці res / drawable:

<? Xml version = "1.0&quot; encoding = "utf-8"?> <Layer-list xmlns: android = "http://schemas.android.com/apk/res/android"> <item> <shape android: dither = "true" android: shape = "oval"> <solid android: color = "# 00000000" /> <size android: height = "100dp" android: width = "100dp" /> </ shape> </ item > <item android: bottom = "44dp" android: left = "48dp" android: right = "48dp" android: top = "15dp"> <shape android: shape = "rectangle"> <solid android: color = "# 99000000 "/> </ shape> </ item> </ layer-list>

Основні відмінності від попереднього файлу - прозорий коло і коротша стрілка. При накладенні на годинник з хвилинною стрілкою, ми побачимо годинникову стрілку, а прозорий коло заважати не буде.

Знову додаємо ImageView в розмітку для годинникової стрілки:

<ImageView android: id = "@ + id / hour_hand" android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: layout_alignParentBottom = "true" android: layout_alignParentRight = "true" android: contentDescription = "@ string / clock "android: padding =" 10dp "android: src =" @ drawable / hour_hand "/>

Компонент повинен знаходитися в тій же позиції, що і годинник.

Створюємо анімаційний файл hour_turn.xml в папці res / anim:

<? Xml version = "1.0&quot; encoding = "utf-8"?> <Set xmlns: android = "http://schemas.android.com/apk/res/android" android: duration = "5000" android: fillAfter = "true" android: interpolator = "@ android: anim / linear_interpolator" android: shareInterpolator = "false"> <rotate android: fromDegrees = "180" android: pivotX = "50%" android: pivotY = "50%" android : toDegrees = "240" /> </ set>

Початкова позиція встановлена ​​в значенні 180 градусів, що відповідає 6 годинах. При анімації стрілка повернеться на 60 градусів і буде відповідати 8 години. За цей час хвилинна стрілка зробить два повних оберти, що відповідає другої години (8-6).

Додамо анімацію в код:

// отримаємо посилання на годинникову стрілку ImageView hourImageView = (ImageView) findViewById (R.id.hour_hand); // анімація для стрілки Animation hourTurnAnimation = AnimationUtils.loadAnimation (this, R.anim.hour_turn); // приєднуємо анімацію hourImageView.startAnimation (hourTurnAnimation);

- А де коти? - заволав мій кіт Рижик, який уважно стежив за створенням проекту. Гаразд, додамо кота.

Як додавати котів, пояснювати не буду. Самі зрозумієте.

Запускаємо проект і спостерігаємо за анімацією. Вийшло красиво, мені подобається.

Вибачте за якість відео. Знімав з рук з телефону на моніторі. І кіт смикав за руку, грізно запитуючи, де коти?

Урок створений за мотивами статті Creating a Simple Tween Animation

додаткове читання

Обговорення статті на форумі.

Реклама
Quot; encoding = "utf-8"?
Quot; encoding = "utf-8"?
Quot; encoding = "utf-8"?
Quot; encoding = "utf-8"?
Quot; encoding = "utf-8"?
Quot; encoding = "utf-8"?
Quot; encoding = "utf-8"?
Quot; encoding = "utf-8"?
І кіт смикав за руку, грізно запитуючи, де коти?

Дополнительная информация

rss
Карта