Перейти к основному содержимому
Версия: 5.21.0

Типографика

ChatTypography управляет двумя слоями типографики SDK:

  1. Размерами шрифтов — 6 семантических токенов (big, medium, mediumUpper, regular, small, error). Это параметры конструктора ChatTypography(...), каждый — экземпляр ChatFontStyle.
  2. Кастомными шрифтами — 20 точек подмены TTF-файла (*FontPath: String?). Это var-свойства в теле класса; задаются после создания объекта (через apply { ... } или прямое присваивание), не через конструктор. Пути указываются относительно app/src/main/assets/.
Только перечисленное здесь

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

Размеры шрифтов

ПолеТипДефолтный размерОписание
bigChatFontStyle20 sp (R.dimen.ecc_text_big)Большой шрифт (заголовки, акценты)
mediumUpperChatFontStyle18 sp (R.dimen.ecc_text_medium_upper)Чуть больше среднего
mediumChatFontStyle16 sp (R.dimen.ecc_text_medium)Средний шрифт
regularChatFontStyle14 sp (R.dimen.ecc_text_regular)Основной шрифт SDK (текст сообщений)
smallChatFontStyle12 sp (R.dimen.ecc_text_small)Малый шрифт (timestamps, подписи)
errorChatFontStyle11 sp (R.dimen.ecc_error_text_size)Шрифт для сообщений об ошибках

ChatFontStyle хранит размер как ссылку на dimen-ресурс в единицах sp (что обеспечивает уважение к accessibility scaling на стороне системы) — изменения системного font scale автоматически масштабируют все 6 семантических токенов.

Кастомные шрифты — 20 точек подмены

Все поля имеют тип String? со значением по умолчанию null (используется системный шрифт). Значение — относительный путь от app/src/main/assets/, например "fonts/Roboto-Regular.ttf".

ПолеОписание
defaultFontRegularPathШрифт по умолчанию (Regular)
defaultFontBoldPathЖирный шрифт по умолчанию
defaultFontLightPathТонкий шрифт по умолчанию
toolbarTitleFontPathЗаголовок тулбара
toolbarSubtitleFontPathПодзаголовок тулбара
placeholderTitleFontPathЗаголовок приветственного экрана
placeholderSubtitleFontPathПодзаголовок приветственного экрана
quoteHeaderFontPathЗаголовок при цитировании
quoteAuthorFontPathАвтор цитируемого сообщения
quoteMessageFontPathТекст цитируемого сообщения
quoteTimeFontPathМетка времени цитаты
inputQuotedMessageFontPathСообщение при цитировании в поле ввода
bubbleMessageFontPathТекст сообщения в чате
bubbleTimeFontPathМетка времени в чате
messageHeaderFontPathЗаголовки даты/времени между сообщениями
typingFontPathИндикатор набора текста
scheduleAlertFontPathУведомление о расписании
systemMessageFontPathСистемные сообщения
emptyMediaAndFilesHeaderFontPathЗаголовок пустого списка «Медиа и файлы»
emptyMediaAndFilesDescriptionFontPathОписание пустого списка «Медиа и файлы»

Базовая настройка

val typography = ChatTypography().apply {
// Глобальные дефолты — заполнят все остальные поля, если они null
defaultFontRegularPath = "fonts/MyFont-Regular.ttf"
defaultFontBoldPath = "fonts/MyFont-Bold.ttf"
defaultFontLightPath = "fonts/MyFont-Light.ttf"

// Точечные переопределения
toolbarTitleFontPath = "fonts/MyFont-Medium.ttf"
bubbleMessageFontPath = "fonts/MyFont-Regular.ttf"
}

val theme = ChatTheme(
applicationContext,
typography = typography
)
Глобальные дефолты + точечная подмена

Сначала задайте defaultFontRegularPath / defaultFontBoldPath / defaultFontLightPath — это покроет 95% поверхности. Затем добавляйте *FontPath только для тех элементов, где нужен другой шрифт.

TypefaceCache не рендерит файл, если путь некорректный

SDK кеширует Typeface через внутренний TypefaceCache. Если файл по указанному пути отсутствует в assets/, SDK молча fallback-нет на системный шрифт — без exception. Проверьте список файлов в app/src/main/assets/fonts/ перед релизом.

Полный бренд-комплект

Переопределение и шрифта, и размеров. Семантические токены задаются через конструктор, *FontPath-поля — через apply { ... }.

Ресурсы — на стороне приложения, тип fontSize — строго @DimenRes

R.dimen.brand_text_* и R.color.brand_* ниже — плейсхолдеры. Объявите их в app/src/main/res/values/dimens.xml (или соответствующем colors.xml) своего приложения перед сборкой, иначе получите Unresolved reference.

ChatFontStyle.fontSize: Int? объявлено без аннотации @DimenRes, но в большинстве пайплайнов SDK значение обрабатывается через Resources.getDimension(...) (см. TextViewFabric, InputViewFabric). Передавайте только R.dimen.*-идентификатор. Литерал в sp (fontSize = 22) приведёт либо к Resources$NotFoundException, либо к некорректному размеру (например, в spannable-тексте, где значение применяется как сырой пиксельный размер).

val brandTypography = ChatTypography(
big = ChatFontStyle(fontSize = R.dimen.brand_text_big), // например, 22 sp
regular = ChatFontStyle(fontSize = R.dimen.brand_text_regular), // например, 15 sp
small = ChatFontStyle(fontSize = R.dimen.brand_text_small) // например, 13 sp
).apply {
defaultFontRegularPath = "fonts/Brand-Regular.ttf"
defaultFontBoldPath = "fonts/Brand-Bold.ttf"
defaultFontLightPath = "fonts/Brand-Light.ttf"
toolbarTitleFontPath = "fonts/Brand-Medium.ttf"
}

val theme = ChatTheme(
applicationContext,
colors = brandColors,
images = brandImages,
typography = brandTypography
)

Подробный сценарий сборки светлой и тёмной тем — в разделе Темы.

Связанные разделы