Робимо живі шпалери з gif анімації
Почнемо із того, що підготуємо анімацію для наших живих шпалер. Звичайно, ви можете знайти будь-яку анімацію, яка вам сподобається і використовувати її, але якщо вам день це робити - качайте цю.
Створюємо новий проект, усі назви файлів можете залишати за замовчуванням, можете вводити свої, як вам зручно. Мінімальну версію Android виберемо 2.2 Froyo, а при виборі activity вибираємоAdd No Activity і тиснемо фініш.
Для живих шпалер необхідно створити файл, який їх описуватиме. Для цього створюємо в нашому проекті папкуxml :

У ній файл на ім'яwallpaper.xml і додаємо туди наступний код:
Введені тут значення імені (label) та іконки (thumbnail) шпалер будуть важливими при виборі їх у списку доступних на пристрої шпалер.
Для запуску живих шпалер нашому додатку знадобиться отримати одну роздільну здатність у файлі маніфестуAndroidManifest.xml :
Живі шпалери запускаються як об'єктService, який може приймати значенняandroid.service.wallpaper.WallpaperService. Назвемо сервісGIFWallpaperService і додамо його до маніфесту проекту:
Тут можливі лайки від Android Studio, але ми мовчки йдемо далі. Тепер нам потрібно подбати про те, щоб наш додаток шпалер міг бути встановлений тільки на той пристрій, який їх підтримує. Для цього додамо в маніфест ще такий код:
Тепер додамо до проекту файл анімації. Для цього потрібно створити спеціальну папку під назвоюassets і помістити туди нашу анімацію на ім'я priroda.gif. Папкаassets повинна знаходитися на одному рівні з папкоюres.
Створюємо новий java клас і назвемо йогоGIFWallpaperService.java. Він повинен успадкувати класWallpaperService :
Android Studioвимагатиме з нас описати необхідний для цього класу метод під назвоюonCreateEngin. Покірно погоджуємося і додаємо наступний код:
Тепер усередині файлуGIFWallpaperService.java створимо клас на ім'яGIFWallpaperEngine, який успадковуватимеWallpaperService.Engine. У цей клас ми додамо таке:
-frameDuration - ціле число, що вказує на довжину затримки між перемальовкою анімації . Значення 20 дає нам 50 кадрів на секунду;
-visible - ця логічна змінна дає програмі знати, коли саме шпалери видно на дисплеї. Коли шпалери нічого очікувати видимими, те й перемальовку виконувати нічого ;
-movie - це анімований gif файл у формі об'єкта movie;
-holder - це посилання до об'єктаSurfaceHolder, він буде ініціалізований за допомогою опису відповідного методу вonCreate () ;
-handler - Це об'єктHandler, який буде використовуватися для запуску анімації.
На даний момент наш клас має виглядати приблизно так:
Далі створюємо методdraw, він вимальовуватиме вміст gif файлу. Ознайомимося з ним краще:
- спочатку ми виконуємо перевірку змінноїvisible, якщо вона має значенняtrue, то робота методу йде далі;
- використовуємо командуlockCanvas з методуSurfaceHolder, для створення полотна для вимальовування нашої анімації;
- після масштабування та розташування анімації, вимальовуємо її на полотніCanvas ;
- коли вимальовування закінчено, передаємоCanvas назад уSurfaceHolder ;
- оновлюємо поточний стан анімації за допомогою методу setTime ;
- Викликаємо вищевказаний метод знову після того, як мине часframeDuration за допомогоюhanler.
Методdraw ніколи не буде викликатися безпосередньо. Він буде викликатися через використання об'єктівHandler таRunnable. Отже, потрібно створити об'єктRunnable, назвемо йогоdrawGIF.
Щоб реалізувати все сказане, додамо доGIFWallpaperService.java наступний код:
Коли стан видимості живих шпалер буде змінюватися, автоматично викликатиметься методonVisibilityChanged, зараз ми його створимо і використовуючи аргумент зміноюvisible, будемо запускати або зупинятиdrawGIF. Для припинення дії шпалер використовуватимемо методremoveCallbacks :
На цьому всі кроки створення живих шпалер з використанням для них gif анімації закінчені. Компілюємо проект, встановлюємо додаток на емулятор пристрій, встановлюємо в налаштуваннях шпалер наш витвір і милуємося чудовим результатом: