- Живые обои андроид студио
- Андроид живые обои. Как делать?
- Canvas
- OpenGL
- OpenGL. Делаем проще.
- GLSurfaceView adapted for 3D Live Wallpapers
- AndEngine
- Заключение.
- В остатке.
- Сделайте Живые Обои под Android Используя GIF Анимацию
- Введение
- Необходимая первоначальная подготовка
- 1. Создайте Новый Проект
- 2. Описание Обоев
- 3. Редактируем Манифес т
- 4. Добавляем GIF анимацию
- 5. Создаем Сервис
- 6. Создаем Engine
- 7. Скомпилируйте и Установите
- Заключение
Живые обои андроид студио
В этом уроке мы научимся создавать живые обои для Android устройства, используя для этого обычную gif анимацию. Конечно, есть и другой способ создания живых обоев, с использованием собственных изображений, математических подсчетов и собственноручно созданной анимации, и его мы как нибудь тоже рассмотрим, но это занимает много сил, времени и требует от создателя творческого мышления, попробуй ка выдумай что нибудь толковое. Но мы пойдем намного более легким путем и сделаем собственные живые обои из обыкновенной 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:
Ну и напоследок, пропишем для нашего класса GIFWallpaperService.java метод onDestroy, который будет полностью останавливать все процессы в смартфоне, которые связаны с использованием сотворенных живых обоев:
На этом все шаги по созданию живых обоев с использованием для них gif анимации закончены. Компилируем проект, устанавливаем приложение на эмулятор устройство, устанавливаем в настройках обоев наше творение и любуемся прекрасным результатом:
Источник
Андроид живые обои. Как делать?
Независимо от того, какие обои вы задумали сделать, существуют 2 различных подхода к реализации ваших задумок: SGL (в дальнейшем Canvas) и OpenGL. Когда я создавал свои первые обои у меня ушло несколько дней, чтобы попробовать различные средства и методы, поэтому эта статья сэкономит вам немного времени и быстро введет вас в курс дел.
Canvas
Если работает для вас — даже и не думайте об OpenGL
Что же такое Canvas? Это главный способ рисования GUI в андроид. Все формы, кнопочки и переключатели отрисовываются с помощью данной технологии. Нам дается Bitmap определенного размера (1024х600 например), на котором мы должны рисовать. Рисовать мы можем с использованием класса Canvas, который имеет богатое высокоуровневое АПИ для рисования. Скажем, нарисовать окружность заданной толщины определенного цвета с включенным сглаживанием не составляет никакой сложности. Есть даже поддержка шейдеров.
Но зачем тогда спрашивается OpenGL?
Недостатки Canvas:
- низкая скорость. Вся работа с графикой производится без аппаратного ускорения (есть исключение). То есть ваш Bitmap вы будите заполнять усилиями центрального процессора, с чем он отлично справляется, если Bitmap умеренного размера. Скорость рисования пропорциональна площади и сильно замедляется при ее увеличении.
- никакого 3d и наворотов. Канва не поддерживает 3d, свойства материалов, расстановку и настройку источников света и др. Если вам нужно, что-то из этого списка, то придется эмулировать это самим, что еще больше замедлит и без того низкую скорость отрисовки.
Преимужества Canvas:
- простота интеграции в приложение. Рисование с помощью Canvas доступно вам сразу. Не надо создавать специальных поверхностей на которую будет выводится изображение созданное с помощью OpenGL. Не надо создавать поток, в котором работает OpenGL и синхронизировать его с вашим сервисом обоев (очень нетривиальная задача).
- простое высокоуровневое АПИ. У канвы есть готовая функция рисования почти на все случаи жизни. Требуется 5 минут, чтобы прочитать документацию на класс и начать успешно использовать его.
К канве мы еще вернемся, теперь поговорим об альтернативном подходе.
OpenGL
Если Canvas не справляется, то больше ничего не остается.
OpenGL, DirectX — все мы слышали эти «крутые» слова. На Андроид у нас доступен OpenGL, но не простой (не такой как на десктопе), а урезанный. Причем у нас даже есть выбор: OpenGL ES 1.0/1.1 (работает везде) или OpenGL ES 2.0 (Android 2.2+). Что такое ES в названии? ES говорит нам о том, что это урезанная версия OpenGL, из которой убрали все лишнее, чтобы сделать АПИ как можно более компактнее и не тащить за собой на мобильные устройства вещи, которые легко эмулировать на центральном процессоре. То есть не все примеры из книжек по обычному OpenGL у вас заработают, но в принципе осталось все также.
Как было замечено версий у нас две: 1.0/1.1 и 2.0. Почитать об их отличиях можно в википедии (выбрать английский язык). Причем не все устройства одинаково поддерживают все расширения OpenGL ES, перед тем как использовать некоторые, нужно убедится, что это поддреживается (почитать можно тут).
Недостатки OpenGL:
- тяжело интегрировать в приложение. Чтобы выводить графику на экран устройства с помощью OpenGL необходимо создать специальную поверхность и специальный поток, который будет на этой поверхности рисовать. Необходимо также позаботиться о синхронизации системы и потока.
- сложное низкоуровневое АПИ. У нас нет функции нарисовать квадрат, нет функции вывести картинку. Зато есть куча флагов и режимов рисования. Если механизмы задания вершин полигонов, матриц преобразования координат, функции загрузки текстур и средства управления наложением… В общем все очень запутано, если вы раньше никогда не имели дело с OpenGL. На освоение уйдет несколько дней.
Преимущества OpenGL:
- высокая скорость работы. Никогда ваше приложение с использованием Canvas не будет работать быстрее и плавнее чем с использованием OpenGL (при наличии прямых рук конечно же).
- поддержка 3d и наворотов. Трехмерные гонки или стрелялки? Все это возможно с использованием OpenGL. Создавайте источники света, управляйте камерой, создайте реалистичный эффект водной поверхности, используйте материалы и др.
И что же делать?
OpenGL. Делаем проще.
Когда тяжело в одиночку — просим помощи.
Понятно, что мы далеко не первые, кто решил использовать OpenGL и все мы уже играли в красивые игрушки, перерезали веревки и спасали сворованные яйца. Редко когда игра пишется абсолютно с нуля, обычно используются движки, которые берут на себя все скучные занятия и предлагают нам более простое АПИ для реализации наших фантазий. И оказываться, применительно к живым обоям, вариантов сделать проще у нас 2…
GLSurfaceView adapted for 3D Live Wallpapers
Так называется статья Роберта Грина, где он рассказывает о созданных им классах (основной из которых GLWallpaperService), которые выполняют всю работу по настройке за нас. Нам же остается писать код, который рисует. Скачав с github файлы проекта (проект живой и недавно обновлялся), вы получите готовые обои, которые правда ничего не делают красивого (просто заливают весь фон цветом), но они уже работают. Вам остается только написать требуемый код для рисования. Об интерфейсе взаимодействия с системой и базовой настройке OpenGL уже позаботились. У Роберта используется OpenGL 1.0/1.1, но перейти на 2.0 не представляет никакой сложности. Стоит так же заметить, что никаких дополнительных средств для рисования не предоставляется, рисовать придется все тем же OpenGL ES АПИ.
AndEngine
AndEngine это настоящий 2d движок для создания игр. Движок поддерживает несколько расширений, среди которых и physicsbox2d для создания физики. Сам движок довольно популярный с открытым кодом (Java). Все средства движка можно использовать для создания обоев. Есть много примеров, которые являются единственной «документацией» движка. Если надо что-то сделать — вспоминаем в каком примере мы это видели и смотрим как это там реализовано. Так же есть форум, где можно попросить помощи (форум активный, быстро помогают).
Теперь о плохом.
Версии у движка 2. Первая (GLES1) использует OpenGL ES 1.0/1.1, вторая (GLES2) — ES 2.0. АПИ в GLES2 намного продвинулось вперед, поэтому лучше использовать GLES2, но мы тогда теряем пользователей Андроида версии 2.1 (GLES2 на нем не работает, a живые обои замечательно работают). Мне удалось запустить обои используя обе версии AndEngine. Но в GLES1 сразу же столкнулся с невозможностью изменить настройки камеры при изменении ориентации экрана (приходится изменять масштаб сцены по одной из осей, в GLES2 АПИ это позволяет).
Движок создан для 2d игр, поэтому никакого АПИ для поддержки 3d не предоставляется (никто не запрещает использовать OpenGL напрямую). Так же отсутствуют казалось бы такие нужные функции как рисование окружности и даже треугольника. Движок больше ориентирован на спрайты. Добавить функцию рисования той же окружности, так чтобы она вписывалась в систему классов движка довольно тяжело — никакой документации нет. Поэтому придется перелопатить много кода и разбираться что к чему.
Заключение.
Начнем делать выводы с того, что я приведу пример: один кадр созданных мной обоев с помощью Canvas рисуется за 17мс на Kindle Fire (6 из которых «лочится» и «анлочится» канва). Это много, для заполнения фона текстурой 16х16px, вывода изображения 350х180px и отрисовки 4х окружностей различной толщины и радиуса. При использовании OpenGL это делается на порядок быстрее. О хорошем: код отрисовки я написал за час с небольшим, 17мс немного — анимация плавная.
В остатке.
Используйте канву, если вам не важно 3d, если ваша анимация не очень сложна и не требует больших вычислительных ресурсов.
Используйте AndEngine, если вы делаете 2d обои. Изучив примеры и почитав форум, вы быстро приступите к созданию вашей анимации, а дополнительные расширения движка позволят вам с легкостью внедрить в вашу анимацию эффектные решения (физика, система частиц и др.)
Используйте GLWallpaperService Роберта Грина. Если вы хорошо владеете OpenGL и делаете 3d обои, он позволит вам, не отвлекаясь на рутину, быстро приступись к кодированию вашей анимации.
Вы также можете адаптировать многие ваши любимые графические OpenGL движки для создания живых обоев. Используя код GLWallpaperService и/или AndEngine в качестве примера.
Источник
Сделайте Живые Обои под Android Используя GIF Анимацию
Russian (Pусский) translation by Andrey Rybin (you can also view the original English article)
Вы когда нибудь видели красивую 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 .
Источник