Google I/O 2016: Watchface 2.0 — Осложнения

Привет, Хабр! Совсем недавно состоялся Google I/O (если кто-то пропустил наш репортаж, нажмите здесь), где был выпущен новый API для отображения данных на циферблатах часов.

Его название пришло из часовой индустрии: по-русски их традиционно называют «Complications», а по-английски — «Complications».



Google I/O 2016: WatchFace 2.0 — осложнения

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

Сегодня мы покажем, на что способен Watch Face Complications API и как с ним работать.




Примечание: текст и обзор API подготовил для вас руководитель ГДГ Ростов-на-Дону.

Александр Куликовский , остальной текст от его имени.

:)




Знакомство с WatchFace 2.0

Привет, я Александр Куликовский, занимаюсь разработкой под Android с 2010 года.

Сейчас работаю в компании Себбия в должности старшего Android-инженера и руководителя ГДГ Ростов-на-Дону.



Давайте начнем

Итак, чтобы опробовать новые возможности Android Watch 2.0, нам нужен чистый проект. Создаём его, указываем API N как минимальную версию SDK (minSdk) для телефона и смотрим.



Google I/O 2016: WatchFace 2.0 — осложнения

Активность для телефона нам не нужна, поэтому выбираем шаблон «Добавить без активности».

Для часов возьмем стандартный шаблон Watch Face. Дадим сервису имя ОсложнениеWatchFaceService , стиль - аналоговый.



Google I/O 2016: WatchFace 2.0 — осложнения

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

  
  
  
  
  
   

compile 'com.google.android.support:wearable:2.0.0-alpha1'



Подключение «осложнений»

Добавьте усложнение нашему циферблату.

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

Чтобы начать получать данные об усложнении, вызываем метод setActiveComplications В ОсложнениеWatchFaceService.Engine , и получаем список идентификаторов посадочных мест для отображения информации:

// Unique IDs for each complication. private static final int LEFT_DIAL_COMPLICATION = 0; private static final int RIGHT_DIAL_COMPLICATION = 1; // Left and right complication IDs as array for Complication API. public static final int[] COMPLICATION_IDS = {LEFT_DIAL_COMPLICATION, RIGHT_DIAL_COMPLICATION}; ….

public void onCreate(SurfaceHolder holder) { .

setActiveComplications(COMPLICATION_IDS); .

}

Данные для отображения поступают в метод onComplicationDataUpdate наш ОсложнениеWatchFaceService.Engine .






Это важно:

К Характеристики Мы вольны отображать полученные данные как пожелаем, но для каждого типа данных существует набор обязательных полей для отображения.

Более подробную информацию об этом можно найти в стол .




Вернемся к нашему примеру.

Метод onComplicationDataUpdate дал нам набор данных, которые мы можем отобразить.

Так как наш циферблат рисуется только в методе onDraw, полученные данные предварительно нужно где-то сохранить.

Для этого мы создадим Разреженныймассив , инициализируйте его onCreate и мы добавим в него все значения в методе onComplicationDataUpdate:

@Override public void onComplicationDataUpdate(int watchFaceComplicationId, ComplicationData data) { super.onComplicationDataUpdate(watchFaceComplicationId, data); mActiveComplicationDataSparseArray.put(watchFaceComplicationId, data); invalidate(); }

Рисование на холсте само по себе нам не интересно – об этом уже сто раз говорилось.

Но вот на что нужно обратить внимание, так это на то, где собственно взять данные, которые мы будем отображать.

В случае TYPE_SHORT_TEXT код будет выглядеть так:

private void drawComplications(Canvas canvas, long currentTimeMillis) { ComplicationData complicationData; for (int i = 0; i < COMPLICATION_IDS.length; i++) { complicationData = mActiveComplicationDataSparseArray.get(COMPLICATION_IDS[i]); if ((complicationData != null) && (complicationData.isActive(currentTimeMillis)) && (complicationData.getType() == ComplicationData.TYPE_SHORT_TEXT)) { ComplicationText mainText = complicationData.getShortText(); ComplicationText subText = complicationData.getShortTitle(); CharSequence complicationMessage = mainText.getText(getApplicationContext(), currentTimeMillis); if (subText != null) { complicationMessage = TextUtils.concat( complicationMessage, " ", subText.getText(getApplicationContext(), currentTimeMillis)); } …….



Но сейчас, если мы запустим проект, никаких осложнений мы не увидим.

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

Потому что он не мог — мы не выделили для него меню настроек… Исправим это: создадим активность настроек и пропишем ее в манифесте:

<service ….

<meta-data android:name="com.google.android.wearable.watchface.wearableConfigurationAction" android:value="com.example.complicationwatchface.CONFIG_COMPLICATION_SIMPLE"/> ….

</service> <activity android:name=".

ComplicationConfigActivity" android:label="@string/complication_simple"> <intent-filter> <action android:name="com.example.complicationwatchface.CONFIG_COMPLICATION_SIMPLE"/> <category android:name="com.google.android.wearable.watchface.category.WEARABLE_CONFIGURATION"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>

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

Integer tag = (Integer) viewHolder.itemView.getTag(); ComplicationItem complicationItem = mAdapter.getItem(tag); startActivityForResult(ProviderChooserIntent.createProviderChooserIntent( complicationItem.watchFace, complicationItem.complicationId, complicationItem.supportedTypes), PROVIDER_CHOOSER_REQUEST_CODE);

Если вы все сделали правильно, то в момент выбора у вас получится что-то вроде этого:

Google I/O 2016: WatchFace 2.0 — осложнения



Google I/O 2016: WatchFace 2.0 — осложнения

Проверим интерфейс в действии: для левого осложнения выберите отображение даты, а для правого — просто произвольное число.

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

Как видите, работать с «усложнениями» максимально просто: десяток-другой строчек кода, и всё работает. Все, что вам нужно сделать, это обновить свои проекты и добавить поддержку новых функций.

Удачи! Теги: #Google I/O #i/o 2016/ android Wear #watchface #complications #Разработка мобильных приложений #Разработка Android #Разработка Интернета вещей

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.