Чтобы начать предоставлять плитки из вашего приложения, включите следующие зависимости в файл build.gradle
вашего приложения.
классный
dependencies { // Use to implement support for wear tiles implementation "androidx.wear.tiles:tiles:1.5.0-alpha04" // Use to utilize standard components and layouts in your tiles implementation "androidx.wear.protolayout:protolayout:1.3.0-alpha04" // Use to utilize components and layouts with Material Design in your tiles implementation "androidx.wear.protolayout:protolayout-material:1.3.0-alpha04" // Use to include dynamic expressions in your tiles implementation "androidx.wear.protolayout:protolayout-expression:1.3.0-alpha04" // Use to preview wear tiles in your own app debugImplementation "androidx.wear.tiles:tiles-renderer:1.5.0-alpha04" // Use to fetch tiles from a tile provider in your tests testImplementation "androidx.wear.tiles:tiles-testing:1.5.0-alpha04" }
Котлин
dependencies { // Use to implement support for wear tiles implementation("androidx.wear.tiles:tiles:1.5.0-alpha04") // Use to utilize standard components and layouts in your tiles implementation("androidx.wear.protolayout:protolayout:1.3.0-alpha04") // Use to utilize components and layouts with Material Design in your tiles implementation("androidx.wear.protolayout:protolayout-material:1.3.0-alpha04") // Use to include dynamic expressions in your tiles implementation("androidx.wear.protolayout:protolayout-expression:1.3.0-alpha04") // Use to preview wear tiles in your own app debugImplementation("androidx.wear.tiles:tiles-renderer:1.5.0-alpha04") // Use to fetch tiles from a tile provider in your tests testImplementation("androidx.wear.tiles:tiles-testing:1.5.0-alpha04") }
Ключевые понятия
Плитки создаются не так, как приложения для Android, и используют другие концепции:
- Шаблоны макетов: определяют общее расположение визуальных элементов на дисплее. Плитка использует либо шаблон макета
EdgeContentLayout
, который включает индикатор выполнения по краю дисплея, либоPrimaryLayout
, который не отображает этот индикатор. - Элементы макета: представляют отдельный графический элемент, такой как
Button
илиChip
, или несколько таких элементов, сгруппированных вместе с помощьюColumn
,MultiButtonLayout
,MultiSlotLayout
или аналогичных. Они встроены в шаблон макета . - Ресурсы: объекты
ResourceBuilders.Resources
состоят из карты пар ключ-значение ресурсов Android (изображений), которые необходимы для визуализации макета, и версии . - Временная шкала: объект
TimelineBuilders.Timeline
представляет собой список одного или нескольких экземпляров объекта макета . Вы можете предоставить различные механизмы и выражения, чтобы указать, когда средство визуализации должно переключиться с одного объекта макета на другой, например, прекратить показ макета в определенное время. - State: структура данных типа
StateBuilders.State
, которая передается между плиткой и приложением, чтобы позволить двум компонентам взаимодействовать друг с другом. Например, если на плитке нажать кнопку, состояние сохранит идентификатор кнопки. Вы также можете обмениваться типами данных с помощью карты. - Tile: объект
TileBuilders.Tile
, представляющий плитку, состоящую из временной шкалы , идентификатора версии ресурсов , интервала актуальности и состояния . - Protolayout: этот термин появляется в названии различных классов, связанных с плитками, и относится к библиотеке Wear OS Protolayout , графической библиотеке, которая используется на различных поверхностях Wear OS.
Создать плитку
Чтобы предоставить плитку из вашего приложения, реализуйте службу типа TileService
и зарегистрируйте ее в своем манифесте. Исходя из этого, система запрашивает необходимые тайлы во время вызовов onTileRequest()
и ресурсы во время вызовов onTileResourcesRequest()
.
class MyTileService : TileService() { override fun onTileRequest(requestParams: RequestBuilders.TileRequest) = Futures.immediateFuture( Tile.Builder() .setResourcesVersion(RESOURCES_VERSION) .setTileTimeline( Timeline.fromLayoutElement( Text.Builder(this, "Hello World!") .setTypography(Typography.TYPOGRAPHY_BODY1) .setColor(argb(0xFFFFFFFF.toInt())) .build() ) ) .build() ) override fun onTileResourcesRequest(requestParams: ResourcesRequest) = Futures.immediateFuture( Resources.Builder() .setVersion(RESOURCES_VERSION) .build() ) }
Затем добавьте службу в тег <application>
вашего файла AndroidManifest.xml
.
<service android:name=".snippets.tile.MyTileService" android:label="@string/tile_label" android:description="@string/tile_description" android:icon="@mipmap/ic_launcher" android:exported="true" android:permission="com.google.android.wearable.permission.BIND_TILE_PROVIDER"> <intent-filter> <action android:name="androidx.wear.tiles.action.BIND_TILE_PROVIDER" /> </intent-filter> <meta-data android:name="androidx.wear.tiles.PREVIEW" android:resource="@drawable/tile_preview" /> </service>
Фильтр разрешений и намерений регистрирует эту службу в качестве поставщика плиток.
Значок, метка, описание и ресурс предварительного просмотра отображаются пользователю, когда он настраивает плитки на своем телефоне или часах.
Разверните свое приложение и добавьте плитку в карусель плиток (есть и более удобный для разработчиков способ предварительного просмотра плитки , но сейчас просто сделайте это вручную).
Рисунок 1. Плитка «Привет, мир».
Полный пример см. в образце кода на GitHub или в лаборатории кода .
Создать пользовательский интерфейс для плиток
Компоновка плитки записывается с использованием шаблона строителя. Макет плитки построен как дерево, состоящее из контейнеров макета и основных элементов макета. Каждый элемент макета имеет свойства, которые вы можете установить с помощью различных методов установки.
Основные элементы макета
Вместе с компонентами Material поддерживаются следующие визуальные элементы из библиотеки protolayout
:
-
Text
: отображает строку текста, при необходимости перенося ее. -
Image
: отображает изображение. -
Spacer
: обеспечивает заполнение между элементами или может выступать в качестве разделителя, когда вы устанавливаете цвет фона.
Компоненты материала
В дополнение к базовым элементам библиотека protolayout-material
предоставляет компоненты, которые обеспечивают дизайн плитки в соответствии с рекомендациями пользовательского интерфейса Material Design.
-
Button
: кликабельный круглый компонент, содержащий значок. Chip
: кликабельный компонент в форме стадиона, содержащий до двух строк текста и дополнительный значок.CompactChip
: кликабельный компонент в форме стадиона, предназначенный для хранения строки текста.TitleChip
: кликабельный компонент в форме стадиона, похожий наChip
, но с большей высотой для размещения текста заголовка.CircularProgressIndicator
: круговой индикатор прогресса, который можно разместить внутриEdgeContentLayout
для отображения прогресса по краям экрана.
Контейнеры макета
Наряду с макетами материалов поддерживаются следующие контейнеры:
-
Row
: размещает дочерние элементы горизонтально, один за другим. -
Column
: размещает дочерние элементы вертикально, один за другим. -
Box
: накладывает дочерние элементы друг на друга. -
Arc
: размещает дочерние элементы по кругу. -
Spannable
: применяет определенныеFontStyles
к разделам текста вместе с чередованием текста и изображений. Для получения дополнительной информации см. Spannables .
Каждый контейнер может содержать одного или нескольких дочерних элементов, которые сами по себе также могут быть контейнерами. Например, Column
может содержать несколько дочерних элементов Row
, что приводит к созданию макета, напоминающего сетку.
Например, плитка с макетом-контейнером и двумя дочерними элементами макета может выглядеть так:
Котлин
private fun myLayout(): LayoutElement = Row.Builder() .setWidth(wrap()) .setHeight(expand()) .setVerticalAlignment(VERTICAL_ALIGN_BOTTOM) .addContent(Text.Builder() .setText("Hello world") .build() ) .addContent(Image.Builder() .setResourceId("image_id") .setWidth(dp(24f)) .setHeight(dp(24f)) .build() ).build()
Ява
private LayoutElement myLayout() { return new Row.Builder() .setWidth(wrap()) .setHeight(expand()) .setVerticalAlignment(VALIGN_BOTTOM) .addContent(new Text.Builder() .setText("Hello world") .build() ) .addContent(new Image.Builder() .setResourceId("image_id") .setWidth(dp(24f)) .setHeight(dp(24f)) .build() ).build(); }
Макеты материалов
В дополнение к базовым макетам библиотека protolayout-material
предоставляет несколько самостоятельных макетов, предназначенных для размещения элементов в определенных «слотах».
PrimaryLayout
: размещает одно основное действиеCompactChip
внизу, а содержимое центрирует над ним.MultiSlotLayout
: позиционирует первичные и вторичные метки с дополнительным содержимым между ними и дополнительнымCompactChip
внизу.MultiButtonLayout
: позиционирует набор кнопок, расположенных в соответствии с рекомендациями по материалам.EdgeContentLayout
: размещает содержимое по краю экрана, напримерCircularProgressIndicator
. При использовании этого макета к содержимому внутри него автоматически применяются соответствующие поля и отступы.
Дуги
Поддерживаются следующие дочерние элементы контейнера Arc
:
-
ArcLine
: отображает изогнутую линию вокруг дуги. -
ArcText
: отображает изогнутый текст в дуге. -
ArcAdapter
: отображает базовый элемент макета в дуге, нарисованной по касательной к дуге.
Дополнительную информацию см. в справочной документации для каждого типа элементов.
Модификаторы
К каждому доступному элементу макета при желании можно применить модификаторы. Используйте эти модификаторы для следующих целей:
- Измените внешний вид макета. Например, добавьте фон, рамку или отступ к элементу макета.
- Добавьте метаданные о макете. Например, добавьте модификатор семантики к элементу макета для использования с программами чтения с экрана.
- Добавьте функциональность. Например, добавьте кликабельный модификатор к элементу макета, чтобы сделать плитку интерактивной. Дополнительные сведения см. в разделе Взаимодействие с плитками .
Например, мы можем настроить внешний вид и метаданные Image
по умолчанию, как показано в следующем примере кода:
Котлин
private fun myImage(): LayoutElement = Image.Builder() .setWidth(dp(24f)) .setHeight(dp(24f)) .setResourceId("image_id") .setModifiers(Modifiers.Builder() .setBackground(Background.Builder().setColor(argb(0xFFFF0000)).build()) .setPadding(Padding.Builder().setStart(dp(12f)).build()) .setSemantics(Semantics.builder() .setContentDescription("Image description") .build() ).build() ).build()
Ява
private LayoutElement myImage() { return new Image.Builder() .setWidth(dp(24f)) .setHeight(dp(24f)) .setResourceId("image_id") .setModifiers(new Modifiers.Builder() .setBackground(new Background.Builder().setColor(argb(0xFFFF0000)).build()) .setPadding(new Padding.Builder().setStart(dp(12f)).build()) .setSemantics(new Semantics.Builder() .setContentDescription("Image description") .build() ).build() ).build(); }
Спаннаблес
Spannable
— это особый тип контейнера, в котором элементы размещаются аналогично тексту. Это полезно, когда вы хотите применить другой стиль только к одной подстроке в большом блоке текста, что невозможно с элементом Text
.
Контейнер Spannable
заполняется дочерними элементами Span
. Другие дочерние элементы или вложенные экземпляры Spannable
не допускаются.
Есть два типа детей Span
:
-
SpanText
: отображает текст в определенном стиле. -
SpanImage
: отображает изображение вместе с текстом.
Например, вы можете выделить слово «мир» курсивом на плитке «Привет, мир» и вставить изображение между словами, как показано в следующем примере кода:
Котлин
private fun mySpannable(): LayoutElement = Spannable.Builder() .addSpan(SpanText.Builder() .setText("Hello ") .build() ) .addSpan(SpanImage.Builder() .setWidth(dp(24f)) .setHeight(dp(24f)) .setResourceId("image_id") .build() ) .addSpan(SpanText.Builder() .setText("world") .setFontStyle(FontStyle.Builder() .setItalic(true) .build()) .build() ).build()
Ява
private LayoutElement mySpannable() { return new Spannable.Builder() .addSpan(new SpanText.Builder() .setText("Hello ") .build() ) .addSpan(new SpanImage.Builder() .setWidth(dp(24f)) .setHeight(dp(24f)) .setResourceId("image_id") .build() ) .addSpan(new SpanText.Builder() .setText("world") .setFontStyle(newFontStyle.Builder() .setItalic(true) .build()) .build() ).build(); }
Работа с ресурсами
Плитки не имеют доступа ни к каким ресурсам вашего приложения. Это означает, что вы не можете передать идентификатор изображения Android элементу макета Image
и ожидать его разрешения. Вместо этого переопределите метод onTileResourcesRequest()
и предоставьте все ресурсы вручную.
Существует два способа предоставления изображений в методе onTileResourcesRequest()
:
- Предоставьте доступный для рисования ресурс, используя
setAndroidResourceByResId()
. - Предоставьте динамическое изображение в виде
ByteArray
используяsetInlineResource()
.
Котлин
override fun onTileResourcesRequest( requestParams: ResourcesRequest ) = Futures.immediateFuture( Resources.Builder() .setVersion("1") .addIdToImageMapping("image_from_resource", ImageResource.Builder() .setAndroidResourceByResId(AndroidImageResourceByResId.Builder() .setResourceId(R.drawable.image_id) .build() ).build() ) .addIdToImageMapping("image_inline", ImageResource.Builder() .setInlineResource(InlineImageResource.Builder() .setData(imageAsByteArray) .setWidthPx(48) .setHeightPx(48) .setFormat(ResourceBuilders.IMAGE_FORMAT_RGB_565) .build() ).build() ).build() )
Ява
@Override protected ListenableFuture<Resources> onTileResourcesRequest( @NonNull ResourcesRequest requestParams ) { return Futures.immediateFuture( new Resources.Builder() .setVersion("1") .addIdToImageMapping("image_from_resource", new ImageResource.Builder() .setAndroidResourceByResId(new AndroidImageResourceByResId.Builder() .setResourceId(R.drawable.image_id) .build() ).build() ) .addIdToImageMapping("image_inline", new ImageResource.Builder() .setInlineResource(new InlineImageResource.Builder() .setData(imageAsByteArray) .setWidthPx(48) .setHeightPx(48) .setFormat(ResourceBuilders.IMAGE_FORMAT_RGB_565) .build() ).build() ).build() ); }
Рекомендуется для вас
- Примечание. Текст ссылки отображается, когда JavaScript отключен.
- Миграция в пространства имен ProtoLayout
-
ConstraintLayout
в Compose - Создавайте собственные плитки быстрых настроек для своего приложения.
Чтобы начать предоставлять плитки из вашего приложения, включите следующие зависимости в файл build.gradle
вашего приложения.
классный
dependencies { // Use to implement support for wear tiles implementation "androidx.wear.tiles:tiles:1.5.0-alpha04" // Use to utilize standard components and layouts in your tiles implementation "androidx.wear.protolayout:protolayout:1.3.0-alpha04" // Use to utilize components and layouts with Material Design in your tiles implementation "androidx.wear.protolayout:protolayout-material:1.3.0-alpha04" // Use to include dynamic expressions in your tiles implementation "androidx.wear.protolayout:protolayout-expression:1.3.0-alpha04" // Use to preview wear tiles in your own app debugImplementation "androidx.wear.tiles:tiles-renderer:1.5.0-alpha04" // Use to fetch tiles from a tile provider in your tests testImplementation "androidx.wear.tiles:tiles-testing:1.5.0-alpha04" }
Котлин
dependencies { // Use to implement support for wear tiles implementation("androidx.wear.tiles:tiles:1.5.0-alpha04") // Use to utilize standard components and layouts in your tiles implementation("androidx.wear.protolayout:protolayout:1.3.0-alpha04") // Use to utilize components and layouts with Material Design in your tiles implementation("androidx.wear.protolayout:protolayout-material:1.3.0-alpha04") // Use to include dynamic expressions in your tiles implementation("androidx.wear.protolayout:protolayout-expression:1.3.0-alpha04") // Use to preview wear tiles in your own app debugImplementation("androidx.wear.tiles:tiles-renderer:1.5.0-alpha04") // Use to fetch tiles from a tile provider in your tests testImplementation("androidx.wear.tiles:tiles-testing:1.5.0-alpha04") }
Ключевые понятия
Плитки создаются не так, как приложения Android, и используют другие концепции:
- Шаблоны макетов. Определите общее расположение визуальных элементов на дисплее. Плитка использует либо шаблон макета
EdgeContentLayout
, который включает индикатор выполнения по краю дисплея, либоPrimaryLayout
, который не отображает этот индикатор. - Элементы макета: представляют отдельный графический элемент, такой как
Button
илиChip
, или несколько таких элементов, сгруппированных вместе с помощьюColumn
,MultiButtonLayout
,MultiSlotLayout
или аналогичных. Они встроены в шаблон макета . - Ресурсы: объекты
ResourceBuilders.Resources
состоят из карты пар ключ-значение ресурсов Android (изображений), которые необходимы для визуализации макета, и версии . - Временная шкала: объект
TimelineBuilders.Timeline
представляет собой список одного или нескольких экземпляров объекта макета . Вы можете предоставить различные механизмы и выражения, чтобы указать, когда средство визуализации должно переключиться с одного объекта макета на другой, например, прекратить показ макета в определенное время. - State: структура данных типа
StateBuilders.State
, которая передается между плиткой и приложением, чтобы позволить двум компонентам взаимодействовать друг с другом. Например, если на плитке нажать кнопку, состояние сохранит идентификатор кнопки. Вы также можете обмениваться типами данных с помощью карты. - Tile: объект
TileBuilders.Tile
, представляющий плитку, состоящую из временной шкалы , идентификатора версии ресурсов , интервала актуальности и состояния . - Protolayout: этот термин появляется в названии различных классов, связанных с плитками, и относится к библиотеке Wear OS Protolayout , графической библиотеке, которая используется на различных поверхностях Wear OS.
Создать плитку
Чтобы предоставить плитку из вашего приложения, реализуйте службу типа TileService
и зарегистрируйте ее в своем манифесте. Исходя из этого, система запрашивает необходимые тайлы во время вызовов onTileRequest()
и ресурсы во время вызовов onTileResourcesRequest()
.
class MyTileService : TileService() { override fun onTileRequest(requestParams: RequestBuilders.TileRequest) = Futures.immediateFuture( Tile.Builder() .setResourcesVersion(RESOURCES_VERSION) .setTileTimeline( Timeline.fromLayoutElement( Text.Builder(this, "Hello World!") .setTypography(Typography.TYPOGRAPHY_BODY1) .setColor(argb(0xFFFFFFFF.toInt())) .build() ) ) .build() ) override fun onTileResourcesRequest(requestParams: ResourcesRequest) = Futures.immediateFuture( Resources.Builder() .setVersion(RESOURCES_VERSION) .build() ) }
Затем добавьте службу в тег <application>
вашего файла AndroidManifest.xml
.
<service android:name=".snippets.tile.MyTileService" android:label="@string/tile_label" android:description="@string/tile_description" android:icon="@mipmap/ic_launcher" android:exported="true" android:permission="com.google.android.wearable.permission.BIND_TILE_PROVIDER"> <intent-filter> <action android:name="androidx.wear.tiles.action.BIND_TILE_PROVIDER" /> </intent-filter> <meta-data android:name="androidx.wear.tiles.PREVIEW" android:resource="@drawable/tile_preview" /> </service>
Фильтр разрешений и намерений регистрирует эту службу в качестве поставщика плиток.
Значок, метка, описание и ресурс предварительного просмотра отображаются пользователю при настройке плиток на телефоне или часах.
Разверните свое приложение и добавьте плитку в карусель плиток (есть и более удобный для разработчиков способ предварительного просмотра плитки , но сейчас просто сделайте это вручную).
Рисунок 1. Плитка «Привет, мир».
Полный пример см. в образце кода на GitHub или в лаборатории кода .
Создать пользовательский интерфейс для плиток
Компоновка плитки записывается с использованием шаблона строителя. Макет плитки построен как дерево, состоящее из контейнеров макета и основных элементов макета. Каждый элемент макета имеет свойства, которые вы можете установить с помощью различных методов установки.
Основные элементы макета
Вместе с компонентами Material поддерживаются следующие визуальные элементы из библиотеки protolayout
:
-
Text
: отображает строку текста, при необходимости перенося ее. -
Image
: отображает изображение. -
Spacer
: обеспечивает отступы между элементами или может выступать в качестве разделителя, когда вы устанавливаете цвет фона.
Компоненты материала
В дополнение к базовым элементам библиотека protolayout-material
предоставляет компоненты, которые обеспечивают дизайн плитки в соответствии с рекомендациями пользовательского интерфейса Material Design.
-
Button
: кликабельный круглый компонент, содержащий значок. Chip
: кликабельный компонент в форме стадиона, содержащий до двух строк текста и дополнительный значок.CompactChip
: кликабельный компонент в форме стадиона, предназначенный для хранения строки текста.TitleChip
: кликабельный компонент в форме стадиона, похожий наChip
, но с большей высотой для размещения текста заголовка.CircularProgressIndicator
: круговой индикатор прогресса, который можно разместить внутриEdgeContentLayout
для отображения прогресса по краям экрана.
Контейнеры макета
Наряду с макетами материалов поддерживаются следующие контейнеры:
-
Row
: размещает дочерние элементы горизонтально, один за другим. -
Column
: размещает дочерние элементы вертикально, один за другим. -
Box
: накладывает дочерние элементы друг на друга. -
Arc
: размещает дочерние элементы по кругу. -
Spannable
: применяет определенныеFontStyles
к разделам текста вместе с чередованием текста и изображений. Для получения дополнительной информации см. Spannables .
Каждый контейнер может содержать одного или нескольких дочерних элементов, которые сами по себе также могут быть контейнерами. Например, Column
может содержать несколько дочерних элементов Row
, что приводит к созданию макета, напоминающего сетку.
Например, плитка с макетом-контейнером и двумя дочерними элементами макета может выглядеть так:
Котлин
private fun myLayout(): LayoutElement = Row.Builder() .setWidth(wrap()) .setHeight(expand()) .setVerticalAlignment(VERTICAL_ALIGN_BOTTOM) .addContent(Text.Builder() .setText("Hello world") .build() ) .addContent(Image.Builder() .setResourceId("image_id") .setWidth(dp(24f)) .setHeight(dp(24f)) .build() ).build()
Ява
private LayoutElement myLayout() { return new Row.Builder() .setWidth(wrap()) .setHeight(expand()) .setVerticalAlignment(VALIGN_BOTTOM) .addContent(new Text.Builder() .setText("Hello world") .build() ) .addContent(new Image.Builder() .setResourceId("image_id") .setWidth(dp(24f)) .setHeight(dp(24f)) .build() ).build(); }
Макеты материалов
В дополнение к базовым макетам библиотека protolayout-material
предоставляет несколько самостоятельных макетов, предназначенных для размещения элементов в определенных «слотах».
PrimaryLayout
: размещает одно основное действиеCompactChip
внизу, а содержимое центрирует над ним.MultiSlotLayout
: позиционирует первичные и вторичные метки с дополнительным содержимым между ними и дополнительнымCompactChip
внизу.MultiButtonLayout
: позиционирует набор кнопок, расположенных в соответствии с рекомендациями по материалам.EdgeContentLayout
: размещает содержимое по краю экрана, напримерCircularProgressIndicator
. При использовании этого макета к содержимому внутри него автоматически применяются соответствующие поля и отступы.
Дуги
Поддерживаются следующие дочерние элементы контейнера Arc
:
-
ArcLine
: визуализирует изогнутую линию вокруг дуги. -
ArcText
: отображает изогнутый текст в дуге. -
ArcAdapter
: отображает базовый элемент макета в дуге, нарисованной по касательной к дуге.
Дополнительную информацию см. в справочной документации для каждого типа элементов.
Модификаторы
К каждому доступному элементу макета при желании можно применить модификаторы. Используйте эти модификаторы для следующих целей:
- Измените внешний вид макета. Например, добавьте фон, рамку или отступ к элементу макета.
- Добавьте метаданные о макете. Например, добавьте модификатор семантики к элементу макета для использования с программами чтения с экрана.
- Добавьте функциональность. Например, добавьте кликабельный модификатор к элементу макета, чтобы сделать плитку интерактивной. Дополнительные сведения см. в разделе Взаимодействие с плитками .
Например, мы можем настроить внешний вид и метаданные Image
по умолчанию, как показано в следующем примере кода:
Котлин
private fun myImage(): LayoutElement = Image.Builder() .setWidth(dp(24f)) .setHeight(dp(24f)) .setResourceId("image_id") .setModifiers(Modifiers.Builder() .setBackground(Background.Builder().setColor(argb(0xFFFF0000)).build()) .setPadding(Padding.Builder().setStart(dp(12f)).build()) .setSemantics(Semantics.builder() .setContentDescription("Image description") .build() ).build() ).build()
Ява
private LayoutElement myImage() { return new Image.Builder() .setWidth(dp(24f)) .setHeight(dp(24f)) .setResourceId("image_id") .setModifiers(new Modifiers.Builder() .setBackground(new Background.Builder().setColor(argb(0xFFFF0000)).build()) .setPadding(new Padding.Builder().setStart(dp(12f)).build()) .setSemantics(new Semantics.Builder() .setContentDescription("Image description") .build() ).build() ).build(); }
Спаннаблес
Spannable
— это особый тип контейнера, в котором элементы размещаются аналогично тексту. Это полезно, когда вы хотите применить другой стиль только к одной подстроке в большом блоке текста, что невозможно с элементом Text
.
Контейнер Spannable
заполняется дочерними элементами Span
. Другие дочерние элементы или вложенные экземпляры Spannable
не допускаются.
Есть два типа детей Span
:
-
SpanText
: отображает текст в определенном стиле. -
SpanImage
: отображает изображение вместе с текстом.
Например, вы можете выделить слово «мир» курсивом на плитке «Привет, мир» и вставить изображение между словами, как показано в следующем примере кода:
Котлин
private fun mySpannable(): LayoutElement = Spannable.Builder() .addSpan(SpanText.Builder() .setText("Hello ") .build() ) .addSpan(SpanImage.Builder() .setWidth(dp(24f)) .setHeight(dp(24f)) .setResourceId("image_id") .build() ) .addSpan(SpanText.Builder() .setText("world") .setFontStyle(FontStyle.Builder() .setItalic(true) .build()) .build() ).build()
Ява
private LayoutElement mySpannable() { return new Spannable.Builder() .addSpan(new SpanText.Builder() .setText("Hello ") .build() ) .addSpan(new SpanImage.Builder() .setWidth(dp(24f)) .setHeight(dp(24f)) .setResourceId("image_id") .build() ) .addSpan(new SpanText.Builder() .setText("world") .setFontStyle(newFontStyle.Builder() .setItalic(true) .build()) .build() ).build(); }
Работа с ресурсами
Плитки не имеют доступа ни к каким ресурсам вашего приложения. Это означает, что вы не можете передать идентификатор изображения Android элементу макета Image
и ожидать его разрешения. Вместо этого переопределите метод onTileResourcesRequest()
и предоставьте все ресурсы вручную.
Существует два способа предоставления изображений в методе onTileResourcesRequest()
:
- Предоставьте доступный для рисования ресурс, используя
setAndroidResourceByResId()
. - Предоставьте динамическое изображение в виде
ByteArray
используяsetInlineResource()
.
Котлин
override fun onTileResourcesRequest( requestParams: ResourcesRequest ) = Futures.immediateFuture( Resources.Builder() .setVersion("1") .addIdToImageMapping("image_from_resource", ImageResource.Builder() .setAndroidResourceByResId(AndroidImageResourceByResId.Builder() .setResourceId(R.drawable.image_id) .build() ).build() ) .addIdToImageMapping("image_inline", ImageResource.Builder() .setInlineResource(InlineImageResource.Builder() .setData(imageAsByteArray) .setWidthPx(48) .setHeightPx(48) .setFormat(ResourceBuilders.IMAGE_FORMAT_RGB_565) .build() ).build() ).build() )
Ява
@Override protected ListenableFuture<Resources> onTileResourcesRequest( @NonNull ResourcesRequest requestParams ) { return Futures.immediateFuture( new Resources.Builder() .setVersion("1") .addIdToImageMapping("image_from_resource", new ImageResource.Builder() .setAndroidResourceByResId(new AndroidImageResourceByResId.Builder() .setResourceId(R.drawable.image_id) .build() ).build() ) .addIdToImageMapping("image_inline", new ImageResource.Builder() .setInlineResource(new InlineImageResource.Builder() .setData(imageAsByteArray) .setWidthPx(48) .setHeightPx(48) .setFormat(ResourceBuilders.IMAGE_FORMAT_RGB_565) .build() ).build() ).build() ); }
Рекомендуется для вас
- Примечание: текст ссылки отображается, когда JavaScript отключен.
- Миграция в пространства имен ProtoLayout
-
ConstraintLayout
в Compose - Создавайте собственные плитки быстрых настроек для своего приложения.