Начиная с версии Tiles 1.2, вы можете передавать обновления данных платформы в потоковом режиме с помощью динамических выражений . Затем вы можете связать эти обновления с анимацией на плитках. Ваше приложение получает обновления этого значения каждую секунду.
Используя динамические выражения, вам не нужно обновлять всю плитку при изменении её содержимого. Чтобы сделать плитки более интересными, анимируйте эти динамические объекты.
Связывать динамические выражения с источниками данных
Пространства имён androidx.wear.protolayout и androidx.wear.protolayout.material содержат множество классов, поля которых принимают динамические выражения. Вот несколько примеров:
- Несколько значений длины, включая длину объекта
Arcи длину объектаCircularProgressIndicator. - Любой цвет, например цвет содержимого объекта
Button. - Множество строковых значений, включая содержимое объекта
Text, содержимое объектаLayoutElementsBuilders.Textи описание содержимого объектаCircularProgressIndicator.
Чтобы использовать динамическое выражение в качестве возможного значения элемента в плитке, используйте соответствующий тип динамического свойства *Prop элемента и передайте источник данных методу setDynamicValue() класса-конструктора динамического типа свойства.
Плитки поддерживают следующие типы динамических свойств:
- Для линейных размеров, измеряемых в пикселях, независимых от дисплея, используйте
DimensionBuilders.DpProp. - Для угловых размеров, измеряемых в градусах, используйте
DimensionBuilders.DegreesProp. - Для строковых значений используйте
TypeBuilders.StringProp. - Для значений цвета используйте
ColorBuilders.ColorProp. - Для значений с плавающей точкой используйте
TypeBuilders.FloatProp.
При использовании динамического выражения, влияющего на физические размеры (любое значение в плитке, за исключением цвета), необходимо также указать набор связанных ограничений, например, формат строки. Эти ограничения позволяют системному рендереру определить максимальный объём пространства, который значение может занимать в плитке. Обычно эти ограничения задаются на уровне элемента, а не на уровне динамического выражения, путём вызова метода, начинающегося с setLayoutConstraintsForDynamic* .
В следующем фрагменте кода показано, как отображать обновления частоты пульса с помощью 3 цифр с резервным значением -- :
override fun onTileRequest(requestParams: RequestBuilders.TileRequest) = Futures.immediateFuture( Tile.Builder() .setResourcesVersion(RESOURCES_VERSION) .setFreshnessIntervalMillis(60 * 60 * 1000) // 60 minutes .setTileTimeline( Timeline.fromLayoutElement( Text.Builder( this, TypeBuilders.StringProp.Builder("--") .setDynamicValue( PlatformHealthSources.heartRateBpm() .format() .concat(DynamicBuilders.DynamicString.constant(" bpm")) ) .build(), TypeBuilders.StringLayoutConstraint.Builder("000").build(), ) .build() ) ) .build() )
Используйте небольшое количество выражений в пределах одной плитки.
Wear OS накладывает ограничение на количество выражений, которые может содержать одна плитка. Если плитка содержит слишком много динамических выражений, динамические значения игнорируются, и система возвращается к статическим значениям, которые вы предоставляете соответствующим типам динамических свойств.
Объединить динамические данные в объект состояния
Вы можете объединить последний набор обновлений из источников данных в состояние , которое вы передадите на свою плитку для рендеринга значений.
Чтобы использовать информацию о штате в своих плитках, выполните следующие действия:
Создайте набор ключей, представляющих различные значения состояния вашей плитки. В этом примере создаются ключи для потребления воды и примечания qqq:
companion object { val KEY_WATER_INTAKE = intAppDataKey("key_water_intake") val KEY_NOTE = stringAppDataKey("key_note") }
В вашей реализации
onTileRequest()вызовитеsetState()и установите начальные сопоставления каждого ключа с определенным динамическим значением данных:override fun onTileRequest( requestParams: RequestBuilders.TileRequest ): ListenableFuture<Tile?> { // If the tile hasn't had any state set yet, use the default values val state = if (requestParams.currentState.keyToValueMapping.isNotEmpty()) requestParams.currentState else StateBuilders.State.Builder() .setStateMap( dynamicDataMapOf( KEY_WATER_INTAKE mapTo 200, KEY_NOTE mapTo "Good" ) ) .build() return Futures.immediateFuture( Tile.Builder() // Set resources, timeline, and other tile properties. .setState(state) .build() ) }
При создании макета, в месте, где вы хотите отобразить данные о состоянии, используйте объект типа
Dynamic*. Вы также можете вызватьanimate(), чтобы отобразить анимацию перехода от предыдущего значения к текущему:val waterIntakeValue = DynamicBuilders.DynamicInt32.from(KEY_WATER_INTAKE)
При необходимости вы также можете обновить состояние, добавив новые значения. Это может быть частью метода
LoadActionплитки.В этом примере значение потребления воды обновлено до
400:val loadAction = loadAction( dynamicDataMapOf( KEY_WATER_INTAKE mapTo 400, KEY_NOTE mapTo "Outstanding" ) )
Рекомендовано для вас
- Примечание: текст ссылки отображается, когда JavaScript отключен.
- Переход на пространства имен ProtoLayout
- Начните работу с плиткой
- Другие соображения