Свой циферблат для Android Wear. С иконками, циферками, подкидным дураком и танцовщицами!

Свой циферблат для 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).

Схема взаимодействия устройств

Обмен данными можно реализовать через три метода:

  1. Data Items, общий объект, состояние которого автоматически синхронизируется между устройствами.
  2. Messages, сообщения, отправляемые устройствами друг другу.
  3. Asset, большой объект для отправки двоичных данных (например, картинка), прикрепляется к объекту типа Data Items.

Рассмотрим обмен сообщениями между устройствами подробнее. Для прослушивания событий используется специальный сервис WearableListenerService. Его нужно описать в манифесте:

Сервис будет принимать сообщения и обрабатывать их в методе onMessageReceived.

Для отправки сообщений нужно сначала подключиться к слою данных.

Подключение к слою:

Потом в отдельном от UI потоке отправить сообщение.

Отображение данных

Для создания собственного циферблата достаточно воспользоваться стандартным конструктором проектов в Android Studio, а после уже доработать его под свои нужды.

Готовый проект циферблата, который выводит на экран время и уровень заряда устройства, я выложил для тебя на гитхабе.

Основой для циферблата служит класс CanvasWatchFaceService. В его методе onCreateEngine будет создан свой экземпляр класса Engine (наследник CanvasWatchFaceService.Engine) Далее запустится циклический таймер, в котором будут обновляться значения времени.

Метод отображения на экран информации реализован в событии onDraw(Canvas canvas, Rect bounds). В нем нам дается холст и определяются его границы. Исходя из того, круглый у нас циферблат или квадратный, и нужно рисовать все, что нам захочется (текст, картинки, графические примитивы).

Подобную работу мы уже проделывали, когда с помощью стандартных средств рисовали игру Xonix в позапрошлом номере. Следует обратить внимание, что часы имеют два состояния: активное и обтекаемое. Сделано это для экономии энергии, мы не будем отрисовывать часть элементов в обтекаемом режиме. Для выявления этих параметров есть событие onAmbientModeChanged(boolean inAmbientMode), где входным параметром будет логический флаг inAmbientMode.

Архитектура проекта

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

📎📎📎📎📎📎📎📎📎📎