Сделайте Живые Обои под Android Используя GIF Анимацию

Сделайте Живые Обои под Android Используя GIF Анимацию

Вы когда нибудь видели красивую GIF анимацию, которая повторяется беспрерывно, и хотели бы поставить такую в качестве живых обоев на ваше устройство, которое работает под Android? Что ж, вы можете это сделать, и в этом уроке, я покажу вам как.

Введение

Чтобы создавать интересные и красивый живые обои с нуля, используя только математику и код, который будет генерировать анимацию, возможно придется много и долго потрудиться. А так же нужно привлечь всю свою креативность. С другой стороны, создать анимированные GIF обои, или найти такие в сети - гораздо проще. В этом уроке, вы узнаете, как конвертировать любоую GIF анимацию в живые обои.

Необходимая первоначальная подготовка

Убедитесь, что у вас установлена последняя версия Android Studio. Вы можете закачать ее с сайта Android Developer.

Хотя можно сделать любую GIF анимацию, я рекомендую вам загрузить хороший синемаграф. Синемаграф - это не что иное, как GIF анимация, которая обычно делается из видео, и плавно зацикливается. Вы можете найти много вариантов на Flickr.

В этом уроке, я использую синемаграф, созданный пользователем Flickr - djandyw.com, так как он распространяется по лицензии Creative Commons.

1. Создайте Новый Проект

Запустите Android Studio, создайте новый проект, и дайте ему название GIFWallpaper. Дайте ему уникальное имя, если вы планируете разместить его на Google Play.

Задайте для minimum SDK - API 8: Android 2.2 (Froyo).

Нашему приложению не нужен статус Activity , поэтому выбираем Add No Activity и жмем Finish.

2. Описание Обоев

Для живых обоев, нужен файл, который будет их описывать. Создайте новый XML файл res/xml/wallpaper.xml и замените его содержание следующим:

Значения имени (label) и иконки (thumbnail) важны, так как они будут показываться в списке обоев доступных на вашем устройстве.

3. Редактируем Манифес т

Для запуска живых обоев, нашему приложению необходимо прописать одно разрешение - android.permission.BIND_WALLPAPER .

Живые обои запускаются как объект Service , который может принимать значение android.service.wallpaper.WallpaperService в качестве intent action. Назовем Service GIFWallpaperService - и добавим его в манифест проекта - AndroidManifest.xml.

Далее, чтобы быть уверенным, что наше приложение ставится на устройство,которое может работать с живыми обоями, мы добавим в манифест такой код:

4. Добавляем GIF анимацию

Копируйте загруженную с Flickr GIF анимацию в папку проекта - assets. Я дал ему название girl.gif.

5. Создаем Сервис

Создадим новый Java класс и назовем его GIFWallpaperService.java. Он должен наследовать класс WallpaperService .

Поскольку WallpaperService - это абстрактный класс, вы должны переопределить метод onCreateEngine и вернуть экземпляр вашему Engine , который может отрисовать кадры для GIF.

Чтобы использовать анимированный GIF, вы должны сперва конвертировать его в объект Movie . Для этого вы можете использовать метод decodeStream класса Movie . После того как Movie создан, отправьте его как параметр в конструктор Engine .

Вот как должен выглядеть метод onCreateEngine :

6. Создаем Engine

Теперь давайте работать над Engine . Создайте класс GIFWallpaperEngine внутри класса GIFWallpaperService , который будет наследовать WallpaperService.Engine .

В этом классе добавим следующие поля:

  • frameDuration : целое число, указывающее длину задержки между перерисовкой анимации. Значение 20, дает нам 50 фреймов в секунду.
  • visible : логическая переменная, которая дает программе знать, когда именно обои видны на дисплее. Это важно, потому что нам не нужно отрисовывать обои, когда их не видно.
  • movie : это анимированный GIFв форме объекта Movie .
  • holder : это отсылка к объекту SurfaceHolder доступному в программе. Он будет инициирован с помощью описания метода onCreate .
  • handler : это объект Handler , который будет использоваться для запуска Runnable , который отвечает за отрисовку обоев.

Ваш класс должен выглядеть таким образом:

Теперь создадим метод под названием draw , который будет отрисовывать содержимое gif файла. Давайте распишем этот метод:

  • Сначала мы проверяем переменную visible на условие true . Если это так, то мы продолжаем.
  • Используем комманду SurfaceHolder's из метода lockCanvas для создания холста - Canvas , на котором будет отрисовываться наша анимация.
  • Рисуем кадра GIF анимации на Canvas , после масштабирования и позиционирования.
  • После того, как отрисовка завершена, передаем Canvas назад в SurfaceHolder .
  • Обновляем текущий кадр GIF анимации, используя метод setTime объекта Movie .
  • Вызываем метод снова используя handler после ожидания frameDuration в миллисекундах.

Метод draw никогда не будет вызываться непосредственно. Он всегда вызывается через использование объектов Handler и Runnable . Поэтому, двайте создадим объект Runnable и назавем его drawGIF .

Добавьте в класс GIFWallpaperService следующий код:

Метод onVisibilityChanged автоматически вызывается, каждый раз когда будет меняться состояние обоев. Мы должны переписать его, что бы на основе значения аргумента visible , запускать или останавливать drawGIF . Метод removeCallbacks объекта Handler будет использоваться для остановки запущенных обоев drawGIF .

И наконец, пререпишем метод onDestroy для Engine , который будет останавливать запуск drawGIF , если обои деактивированы.

7. Скомпилируйте и Установите

Теперь ваши живые обои готовы. Скомпилируйте их и установите на ваш девайс под Android. После того, как вы их установите, вы сможете найти их в списке доступных обоев.

Большинство лаунчеров дают вам возможность изменять обои, после долгого нажатия на экран. Или вы можете зайти в настройки экрана, чтобы сменить обои.

Если GIF выглядить слишком маленьким, или неправильно позиционирован, вернитесь вновь к методу draw и настройте масштаб и положение.

Заключение

Тепере вы знаете, как использовать GIF анимацию, чтобы создать живые обои. Обязательно поэкспериментируюйте с другими вариантами GIF анимации. Если вы захотите выложить свои обои на Google Play, убедитесь, что у вас есть разрешение, от автора, на использование его GIF анимации в коммерческих целях. Зайдите на сайт Android Developer, чтобы узнать больше о классе WallpaperService .

📎📎📎📎📎📎📎📎📎📎