← Назад к вопросам

Как отрисовывается текст на экране

2.0 Middle🔥 111 комментариев
#UI и вёрстка#Производительность и оптимизация

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как отрисовывается текст на экране в Android

Отрисовка текста в Android — это многоэтапный процесс, который начинается с декларации в XML или программного задания и завершается отрисовкой пикселей на экране. Процесс можно разделить на несколько ключевых этапов.

1. Загрузка и измерение текста

Когда система встречает TextView (или другой компонент, отображающий текст), она сначала должна определить его размеры. Для этого используется класс Paint (кисть) и метод measureText().

val paint = Paint().apply {
    textSize = 16f * resources.displayMetrics.density // Конвертация sp в пиксели
    typeface = Typeface.DEFAULT
}
val textWidth = paint.measureText("Пример текста")

На этом этапе система:

  • Определяет шрифт (Typeface) и его метрики (высоту строки, ascent, descent).
  • Рассчитывает ширину текста для возможного переноса строк.
  • Учитывает дополнительные атрибуты: letterSpacing, textScaleX, includeFontPadding.

2. Создание макета (Layout)

После измерения текст необходимо расположить в пределах доступного пространства. За это отвечает класс Layout и его наследники (StaticLayout, DynamicLayout, BoringLayout).

val staticLayout = StaticLayout(
    "Длинный текст для примера переноса строк",
    paint,
    availableWidth,
    Layout.Alignment.ALIGN_NORMAL,
    1.0f, // lineSpacingMultiplier
    0.0f, // lineSpacingExtra
    false // includePad
)

StaticLayout разбивает текст на строки согласно ширине контейнера, применяет выравнивание и рассчитывает вертикальное положение каждой строки.

3. Непосредственная отрисовка (Canvas)

Финальный этап происходит в методе onDraw() View. Здесь используется объект Canvas (холст), который получает команды для отрисовки.

override fun onDraw(canvas: Canvas) {
    super.onDraw(canvas)
    // 1. Отрисовка фона и других элементов (если есть)
    // 2. Отрисовка текста
    canvas.drawText("Текст", x, y, paint)
    // Или отрисовка целого layout
    staticLayout.draw(canvas)
}

Ключевые моменты отрисовки:

  • Координата y при вызове drawText() — это базовая линия (baseline) текста, а не его верхний край.
  • Для многострочного текста Layout сам итерируется по строкам и вызывает canvas.drawText() для каждой.
  • На этом этапе применяются тени (setShadowLayer), маски (MaskFilter), поддержка эмодзи и аппаратное ускорение.

4. Аппаратное ускорение и кэширование

Современные версии Android активно используют аппаратное ускорение для отрисовки текста:

  • Текст часто кэшируется в текстуры GPU как растровые глифы.
  • Библиотека TextLayoutCache минимизирует повторные вычисления layout.
  • При использовании PrecomputedText (API 21+) тяжелые вычисления (перенос строк, определение направленности) выполняются асинхронно до отрисовки.
val precomputedText = PrecomputedText.create("Текст", textParams)
textView.setTextFuture(PrecomputedText.getTextFuture(text, textParams, executor))

5. Влияние производительности

  • Измерение — самая дорогая операция. Частые вызовы measureText() с разными параметрами (например, в RecyclerView) требуют оптимизации.
  • Создание Paint и Typeface также ресурсоемко. Эти объекты следует переиспользовать.
  • Сложные шрифты (с лигатурами, переменной шириной) замедляют и измерение, и отрисовку.
  • Аппаратное ускорение ускоряет отрисовку, но может иметь ограничения (максимальная размерность текстуры, прозрачность).

Краткий алгоритм отрисовки TextView:

  1. setText() — текст и параметры сохраняются.
  2. onMeasure() — создается временный Layout для определения размеров View.
  3. onLayout() — финальные размеры View известны, создается основной Layout.
  4. onDraw()Layout отрисовывается на Canvas с помощью drawText() для каждой строки.
  5. Движок Android (Skia/OpenGL) — растеризует команды Canvas в пиксели в системном композиторе SurfaceFlinger.

Таким образом, отрисовка текста — это синтез типографики, 2D-графики и системной оптимизации, где каждый этап, от загрузки глифа шрифта до финального пикселя на экране, тщательно оптимизирован в рамках Android-фреймворка.

Как отрисовывается текст на экране | PrepBro