Свой циферблат для Android Wear. С иконками, циферками, подкидным дураком и танцовщицами!
Раньше ты мог десятками лет наблюдать один и тот же экран старых аналоговых часов. То ли дело сейчас — распаковав коробку со своими первыми часами на Андроиде, ты начинаешь постоянно экспериментировать с циферблатами в надежде найти «тот самый». На одних будет информация о погоде, на других количество пройденных шагов, на третьих просто красивая картинка. А если не отыщется нужный, то можно написать свой собственный и вывести на экран какую хочешь информацию — от погоды и курса валют до счетчика оставшегося до дня рождения любимого кота времени. И мы тебе в этом сегодня поможем!
Xakep #201. Как стать киборгомНаписать такое приложение можно как при помощи Eclipse, так и в Android Studio. Я предпочитаю последнюю, поскольку в ней уже есть готовые шаблоны и примеры, к тому же ее рекомендует и поддерживает сама Google. Можно написать приложение только для часов, а можно и такое, которое будет обмениваться данными со смартфоном. Во втором случае мы на выходе получим один APK-файл для смартфона, в котором, как в матрешке, будет еще один APK для часов. Распаковка произойдет автоматически при установке.
Архитектура циферблата
Циферблат (Watch Face), находящийся на основном экране, является сервисом (наследник СanvasWatchFaceService), который в заданный период отрисовывает экран.
Список доступных циферблатов можно увидеть как на самих часах, так и на сопряженном смартфоне в приложении Android Wear.
Циферблаты в приложении Android Wear
Для уведомления системы о циферблате нужно описать в манифесте приложения сам сервис. При разработке надо учитывать особенности экранов (круглые или квадратные).
Пример описания сервиса в манифесте:
Циферблат может быть с настройками и без.
Для установки настроек циферблата нужно создать отдельный класс Activity и описать его в манифесте приложения. Настройки можно вызвать на часах или создать класс настроек для смартфона. Описание этих настроек доступно тут и тут.
Обмен данными
Для обмена данными между устройствами используется специальный слой данных (Wearable Data Layer).
Физически обмен происходит по Bluetooth 4.0 и Wi-Fi. Смартфон для работы с ним должен иметь версию ОС не ниже Android 4.3 (API Level 18).
Схема взаимодействия устройств
Обмен данными можно реализовать через три метода:
- Data Items, общий объект, состояние которого автоматически синхронизируется между устройствами.
- Messages, сообщения, отправляемые устройствами друг другу.
- Asset, большой объект для отправки двоичных данных (например, картинка), прикрепляется к объекту типа Data Items.
Рассмотрим обмен сообщениями между устройствами подробнее. Для прослушивания событий используется специальный сервис WearableListenerService. Его нужно описать в манифесте:
Сервис будет принимать сообщения и обрабатывать их в методе onMessageReceived.
Для отправки сообщений нужно сначала подключиться к слою данных.
Подключение к слою:
Потом в отдельном от UI потоке отправить сообщение.
Отображение данных
Для создания собственного циферблата достаточно воспользоваться стандартным конструктором проектов в Android Studio, а после уже доработать его под свои нужды.
Готовый проект циферблата, который выводит на экран время и уровень заряда устройства, я выложил для тебя на гитхабе.
Основой для циферблата служит класс CanvasWatchFaceService. В его методе onCreateEngine будет создан свой экземпляр класса Engine (наследник CanvasWatchFaceService.Engine) Далее запустится циклический таймер, в котором будут обновляться значения времени.
Метод отображения на экран информации реализован в событии onDraw(Canvas canvas, Rect bounds). В нем нам дается холст и определяются его границы. Исходя из того, круглый у нас циферблат или квадратный, и нужно рисовать все, что нам захочется (текст, картинки, графические примитивы).
Подобную работу мы уже проделывали, когда с помощью стандартных средств рисовали игру Xonix в позапрошлом номере. Следует обратить внимание, что часы имеют два состояния: активное и обтекаемое. Сделано это для экономии энергии, мы не будем отрисовывать часть элементов в обтекаемом режиме. Для выявления этих параметров есть событие onAmbientModeChanged(boolean inAmbientMode), где входным параметром будет логический флаг inAmbientMode.
Архитектура проекта
В конечном итоге у нас получится проект из двух модулей — один для смартфона, другой для часов. В смартфонном модуле расположится сервис, который будет принимать и отправлять сообщения об уровне заряда батареи. В этом модуле можно смело реализовывать какую угодно функциональность, например скачивание из интернета прогноза погоды и отправку его на часы. В модуле часов у нас будет два сервиса — один для обмена сообщениями, другой для отрисовки циферблата.