Аннотированные строки

Последнее обновление: 04.04.2024

Аннотированные строки (Annotated strings) позволяют разбить текст на сегменты, каждый из которых будет иметь свою собственную стилизацию. Аннотированные строки представляют объект AnnotatedString. Для его создания применяется функция buildAnnotatedString(), которой передается отображаемый текст и стили.

Поддерживаются два типа стилей: SpanStyle и ParagraphStyle

SpanStyle

Первый тип стилей представляет объект SpanStyle и используется для стилизации отдельных символов в строке. SpanStyle имеет следующий конструктор:

SpanStyle(
    color: Color = Color.Unspecified,
    fontSize: TextUnit = TextUnit.Unspecified,
    fontWeight: FontWeight? = null,
    fontStyle: FontStyle? = null,
    fontSynthesis: FontSynthesis? = null,
    fontFamily: FontFamily? = null,
    fontFeatureSettings: String? = null,
    letterSpacing: TextUnit = TextUnit.Unspecified,
    baselineShift: BaselineShift? = null,
    textGeometricTransform: TextGeometricTransform? = null,
    localeList: LocaleList? = null,
    background: Color = Color.Unspecified,
    textDecoration: TextDecoration? = null,
    shadow: Shadow? = null,
    platformStyle: PlatformSpanStyle? = null,
    drawStyle: DrawStyle? = null
)

Из конструктора мы видим, какие параметры текста устанавливает SpanStylе:

  • color: цвет текста

  • fontSize: высота шрифта

  • fontWeight: вес шрифта.

  • fontStyle: стиль шрифта.

  • fontSynthesis: устанавливает синтез толщины и/или стиля шрифта, если запрошенную толщину или стиль невозможно найти в предоставленном семействе шрифтов.

  • fontFamily: семейство шрифтов.

  • fontFeatureSettings: настройки типографии шрифта

  • letterSpacing: расстояние между буквами.

  • baselineShift: величина, на которую сдвигается текст вверх относительно базовой линии.

  • textGeometricTransform: применяемые к тексту геометрические трансформации.

  • localeList: список локалей, который используется для выбора специфичных для языка глифов

  • background: фоновый цвет текста.

  • textDecoration: декорации текста.

  • shadow: тень текста.

  • platformStyle: платформозависимые параметры стиля.

  • drawStyle: стиль заполнения текста.

Для создания и применения SpanStyle используется следующий синтаксис:

buildAnnotatedString {

    withStyle(style = SpanStyle( настройки_стилей)) { 
        append(стилизуемый_текст)
    }

    withStyle(style = SpanStyle( настройки_стилей)) { 
        append(стилизуемый_текст)
    }

    ...................................
}

Для добавления сегмента в текст применяется функция append(), в которую передается добавляемая подстрока. Если append() вызывается в контексте функции withStyle(), то к добавляемому тексту применяется стилизация определенная с помощью SpanStyle.

Применение SpanStyle:

package com.example.helloapp

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.material3.Text

import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.withStyle
import androidx.compose.ui.unit.sp

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            Text(
                buildAnnotatedString {
                    withStyle(SpanStyle(fontWeight = FontWeight.Bold, fontSize = 30.sp)) {
                        append("H")
                    }
                    append("ello ")

                    withStyle(SpanStyle(fontWeight = FontWeight.Bold, fontSize = 23.sp, color = Color.Blue)) {
                        append("METANIT.COM")
                    }
                }
            )
        }
    }
}

В данном случае текст разбивается на три сегмента. Первый сегмент состоит из одной буквы "H", к которой применяется некоторое форматирование. Второй сегмент - "ello" не использует никакого форматирования и добавляется в текст как есть. И затем добавляется третий сегмент, к которому также применяется некоторая стилизация:

Аннотированные строки и SpanStyle в Jetpack Compose на Kotlin и Android

ParagraphStyle

Второй способ стилизации предоставляет класс ParagraphStyle. Он применяется к отдельным параграфам и имеет следующие параметры:

ParagraphStyle(
    textAlign: TextAlign = TextAlign.Unspecified,
    textDirection: TextDirection = TextDirection.Unspecified,
    lineHeight: TextUnit = TextUnit.Unspecified,
    textIndent: TextIndent? = null,
    platformStyle: PlatformParagraphStyle? = null,
    lineHeightStyle: LineHeightStyle? = null,
    lineBreak: LineBreak = LineBreak.Unspecified,
    hyphens: Hyphens = Hyphens.Unspecified,
    textMotion: TextMotion? = null
)
  • textAlign: выравнивание текста в параграфе

  • textDirection: направление текста (слева направо или справо налево)

  • lineHeight: высота строк

  • textIndent: настройки отступа в параграфе

  • platformStyle: платформо-зависимые параметры

  • lineHeightStyle: конфигурация для установки высоты строк. Применяется, если параметр lineHeight установлен

  • lineBreak: настройка разрыва строк

  • hyphens: настройки переносов

  • textMotion: настройки размещения текстовых символов, оптимизация для анимированного или статического текста.

Для создания и применения ParagraphStyle используется следующий синтаксис:

buildAnnotatedString {

    withStyle(style = ParagraphStyle( настройки_стилей)) { 
        append(стилизуемый_текст)
    }

    withStyle(style = ParagraphStyle( настройки_стилей)) { 
        append(стилизуемый_текст)
    }

    ...................................
}

Применение ParagraphStyle:

package com.example.helloapp

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.material3.Text

import androidx.compose.ui.text.ParagraphStyle
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.style.TextIndent
import androidx.compose.ui.text.withStyle
import androidx.compose.ui.unit.sp

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            Text(
                buildAnnotatedString {
                    append("Все мы сейчас желаем кушать, потому что утомились и уже четвертый час, но это")
                    withStyle(ParagraphStyle(lineHeight = 25.sp, textIndent = TextIndent(firstLine = 30.sp, restLine = 8.sp))) {
                        append("Все мы сейчас желаем кушать, потому что утомились и уже четвертый час, но это")
                    }
                },
                fontSize = 22.sp)
        }
    }
}

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

Аннотированные строки и ParagraphStyle в Jetpack Compose на Kotlin и Android
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850