Анімація в Android додатку

&nbsp

У інструментарії для користувача інтерфейсу 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 Він викликається для генерації послідовних кадрів анімації У прикладі 912 показана реалізація одного перетворення Як бачите, для анімації не генеруються цільні графічні кадри Замість цього генеруються послідовні перетворення, які будуть застосовуватися до аніміруемому зображенню Як ви памятаєте з пункту «Матричні перетворення» вище, такі перетворення використовуються для того, щоб обєкт начебто рухався Анімації переходу засновані саме на такому прийомі

Приклад 912 Анімація переходу

При застосуванні даної конкретної реалізації до обєкта створюється враження, ніби обєкт крутиться в площині екрану (виклик методу rotate) і в той же час зникає вдалині (виклик методу translate) Матрицю, яка буде застосовуватися до цільового зображенню, ми отримуємо від обєкта Transformation, який був переданий при виклику

Дана реалізація використовує camera, примірник допоміжного класу Camera Клас Camera ніяк не повязаний з тією камерою, яка встановлена ​​в телефоні, – це допоміжний клас, який дозволяє записувати стан зображення Тут він використовується для складання перетворень обертання і переходу в єдиній матриці, яка потім зберігається у вигляді анімації переходу

Перший параметр, який посилає applyTransformation, називається t Фактично це номер кадру Він передається як число з плаваючою крапкою в діапазоні від 0,0 до 1,0 Це число можна охарактеризувати і як процентний показник того, наскільки завершена анімація У цьому прикладі t використовується для збільшення видимого відстані до аніміруемого обєкта по осі Z (це лінія, перпендикулярна площині екрану) і для завдання частки від повного повороту, тобто для вказівки, наскільки повернулося зображення При збільшенні t здається, що аніміруемое зображення обертається все далі від нас проти годинникової стрілки, причому віддаляється від нас по осі Z

Операції preTranslate і postTranslate необхідні для того, щоб переходи зображення відбувалися навколо центру цього зображення За замовчуванням матричні операції перетворять обєкт, змінюючи його відносно початку координат (верхнього лівого кута) Якби ми не обрамили наші перетворення в preTranslate і postTranslate, то здавалося б, що цільове зображення обертається навколо свого лівого верхнього кута Фактично preTranslate переміщує початок координат до центру анімації, яка повинна вийти після операції переходу, a postTranslate призводить до відновлення координат після завершення переходу

Якщо подумати про те, що саме має робити анімація переходу, то стає зрозуміло, що вона фактично повинна неначе суміщати дві анімації: анімація з попереднього кадру повинна затухати, а анімація з наступного – наростати У прикладі 912 саме так застосовується остання змінна, яку ми ще не пояснили, – dir Її значення може бути дорівнює 1 або -1 Вона визначає, коли анімоване зображення неначе стискається, а коли – поступово збільшується, виходячи на передній план Нам потрібно просто знайти спосіб, щоб обєднати процеси стиснення і розростання в одну анімацію

Для цього застосовується вже знайомий вам патерн зі слухачем Listener Клас Animation визначає слухач, званий AnimationAnimationListener Будь примірник Anitnation, що володіє ненульовим слухачем, викликає цей слухач один раз при запуску, один раз при зупинці і по разу для кожної ітерації між початком і завершенням цього процесу Слухач, замечающий, що анімація стиснення завершується, повинен породжувати нову анімацію, при якій зображення розростається Тоді ви досягнете необхідного ефекту У прикладі 913 показана частина, що залишилася реалізації цієї анімації

Приклад 913 Склад анімації переходу

Перехід починається з методу 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 для нового покоління мобільних пристроїв

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*