Paint в Android: что это, методы настройки и как работает

Автор: IT Sectr Опубликовано: 2026-07-21 Время чтения: 9 мин

Paint — основной класс для стилизации графики в Android Canvas. Он определяет цвет, толщину линии, стиль заливки, эффекты размытия и шрифты для всех операций рисования в пользовательском интерфейсе. Без Paint Canvas не может применять визуальные атрибуты к отображаемым элементам. По данным Google Developers, 2026, Paint поддерживает до 42 стилевых параметров, включая градиенты и текстуры.

Главное

  • Paint — объект стилизации для Canvas, содержащий все визуальные настройки рисования.
  • setColor и setAlpha управляют цветом и прозрачностью линий и заливок.
  • Style определяет, рисуется контур, заливка или оба варианта одновременно.
  • Shader позволяет применять градиенты, растровые текстуры и композитинги.
  • Typeface задаёт шрифт для текста с поддержкой всех системных гарнитур Android.

Что такое Paint в Android?

Paint — класс из пакета android.graphics, который хранит все настройки стилей для операций рисования на Canvas. Он не содержит самих пикселей, а определяет как именно будут выглядеть линии, фигуры и текст. Каждый вызов метода Canvas — drawCircle, drawLine, drawText — использует Paint для интерпретации визуального представления.

Paint работает по принципу конфигурационного объекта. Вы создаёте экземпляр, задаёте параметры один раз и переиспользуете его для множества операций. Это минимизирует количество аллокаций в цикле отрисовки и повышает производительность до 30% по сравнению с созданием нового объекта каждый кадр. По данным Google I/O 2024, оптимизация Paint — одна из ключевых практик для достижения 60 FPS в кастомной графике.

Все настройки Paint делятся на несколько категорий: цвет и прозрачность, стиль обводки и заливки, работа с текстом и шрифтами, эффекты размытия и маскирования. Каждая категория управляется отдельными методами-сеттерами, которые можно комбинировать в любых сочетаниях. Это делает API Paint гибким, но требующим понимания взаимодействия параметров — например, Style влияет на то, применяется ли Shader к контуру или к заливке.

Цвет и прозрачность в Paint

setColor — основной метод задания цвета для всех последующих операций рисования. Цвет передаётся в формате ARGB (32-битное целое число), где старшие 8 бит — альфа-канал, а остальные — красный, зелёный и синий каналы. Значение 0xFF0000FF задаёт непрозрачный синий цвет.

Управление альфа-каналом

Метод setAlpha позволяет независимо регулировать прозрачность в диапазоне от 0 (полностью прозрачный) до 255 (полностью непрозрачный). В отличие от указания альфы в setColor, этот метод не влияет на уже установленный цветовой тон — он лишь модулирует общую прозрачность. Это удобно для анимации появления и исчезания элементов без смены цвета.

ColorFilter для цветокоррекции

ColorFilter — механизм трансформации цвета каждого пикселя перед отрисовкой. Поддерживаются три режима: LightingColorFilter для умножения и сложения каналов, PorterDuffColorFilter для наложения с использованием режимов смешивания и ColorMatrixColorFilter для полноценной матричной трансформации. ColorFilter применяется после Shader, но до вывода на Canvas.

Для большинства задач достаточно стандартного setColor или setAlpha. ColorFilter используется преимущественно для эффектов обесцвечивания, сепии или инвертирования. Применение ColorFilter увеличивает нагрузку на GPU, поэтому Google рекомендует минимизировать его использование в циклических вызовах onDraw.

МетодОписаниеПроизводительность
setColorУстанавливает цвет в ARGBO(1) — без накладных расходов
setAlphaРегулирует прозрачность (0-255)O(1) — легковесная операция
setColorFilterПрименяет цветокоррекциюO(n) — влияет на FPS при частых вызовах

Стиль и толщина линии

Метод setStyle принимает одно из трёх значений Paint.Style: FILL (заливка), STROKE (контур) или FILL_AND_STROKE (одновременно). От выбора стиля зависит, будет ли фигура отображаться как силуэт, как каркас или как контур с внутренней заливкой. По умолчанию Paint создаётся со стилем FILL.

Толщина линии и соединения

setStrokeWidth задаёт толщину линии в пикселях для режима STROKE. Для округлённых фигур и скруглённых углов используются setStrokeCap (Cap.ROUND, BUTT, SQUARE) и setStrokeJoin (Join.MITER, ROUND, BEVEL). Эти параметры критически влияют на внешний вид графиков, путей и рамок в кастомных View.

При толщине менее 1 пикселя линия рисуется с субпиксельной точностью, но может выглядеть размытой на экранах с низкой плотностью. Для Retina-дисплеев Android используйте TypedValue.applyDimension для пересчёта dp в пиксели. Толщина в 2 dp обеспечивает чёткую видимость на большинстве устройств.

Паттерны штриховки (DashPathEffect)

DashPathEffect создаёт пунктирные и штрихпунктирные линии. Конструктор принимает массив длин чередующихся штрихов и пропусков и начальное смещение фазы. Например, массив [10, 5, 3, 5] создаёт линию с длинным штрихом, коротким пробелом, коротким штрихом и пробелом. Этот эффект активно применяется в графических редакторах и инструментах для аннотаций.

Объединение стилей осуществляется через setPathEffect. Комбинируя CornerPathEffect, DashPathEffect и DiscretePathEffect, можно создавать сложные визуальные линии для диаграмм, подписей и декоративных элементов. Каждый PathEffect вычисляется на CPU, поэтому в анимациях с большим количеством линий рекомендуется заранее растеризовать эффект в Bitmap.

kotlin
val paint = Paint().apply {
    setStyle(Paint.Style.STROKE)
    setStrokeWidth(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2f, resources.displayMetrics))
    setPathEffect(DashPathEffect(floatArrayOf(10f, 5f, 3f, 5f), 0f))
}

Шрифты и отрисовка текста

Typeface — объект, определяющий гарнитуру шрифта для всех текстовых операций Paint. Android поддерживает системные шрифты (Roboto, Noto Sans), кастомные шрифты из ресурсов assets и загружаемые шрифты через Downloadable Fonts API. Установка Typeface осуществляется через setTypeface на экземпляре Paint.

Размер текста и межстрочный интервал

Метод setTextSize задаёт размер шрифта в пикселях. Для корректного отображения на разных экранах рекомендуется указывать размер в sp с помощью TypedValue.applyDimension. Межстрочный интервал регулируется setTextScaleX для горизонтального растяжения и включается встроенной поддержкой MultiLine текста через Canvas.drawText.

Для выравнивания текста используется setTextAlign со значениями LEFT, CENTER и RIGHT. При CENTER координата x, переданная в drawText, становится центральной точкой текста — это особенно удобно для подписей под иконками и заголовков внутри фигур. Для точного позиционирования применяются методы measureText и getTextBounds, возвращающие ширину и прямоугольник границ текста.

Подчеркивание и зачёркивание

setUnderlineText и setStrikeThruText включают подчёркивание и зачёркивание соответственно. Эти параметры работают на уровне гарнитуры и применяются ко всему тексту, рисуемому данным Paint. Для гибкого форматирования разных частей одной строки используйте отдельные объекты Paint с разными настройками или переключайте параметры между вызовами drawText.

МетодНазначениеЕдиницы измерения
setTextSizeРазмер шрифтаpx (пиксели)
setTextAlignГоризонтальное выравниваниеLEFT, CENTER, RIGHT
setTypefaceГарнитура шрифтаTypeface object
setUnderlineTextПодчёркиваниеBoolean

Градиенты и продвинутые эффекты

Shader — базовый класс для заполнения фигур градиентами, растровыми текстурами и композитингами. Через метод setShader можно назначить любой из подклассов: LinearGradient, RadialGradient, SweepGradient, BitmapShader или ComposeShader. Shader замещает цвет, заданный setColor, и применяется ко всем рисуемым элементам.

Линейные и радиальные градиенты

LinearGradient создаёт плавный переход между двумя или более цветами вдоль прямой линии. Конструктор принимает начальную и конечную точки, массив цветов и их позиции (tile mode). Tile mode определяет поведение за пределами градиента: CLAMP (повтор последнего цвета), MIRROR (отражение) или REPEAT (повтор). LinearGradient активно применяется для фоновых заливок и прогресс-баров.

RadialGradient создаёт круговой градиент от центра к краям. Центр задаётся координатами, радиус определяет область перехода цветов. Внешний вид радиального градиента напоминает освещение от точечного источника — это часто используется для имитации свечения кнопок и подсветки активных элементов.

Размытие и тени (BlurMaskFilter)

BlurMaskFilter добавляет эффект размытия вокруг рисуемых элементов. Конструктор принимает радиус размытия и стиль: NORMAL (размытие по всем направлениям), INNER (только внутри фигуры), OUTER (только снаружи) и SOLID (фигура + внешнее размытие). BlurMaskFilter работает с любыми типами Paint и часто используется для создания теней и эффектов свечения.

kotlin
val paint = Paint().apply {
    setShader(LinearGradient(
        0f, 0f, width, height,
        intArrayOf(Color.RED, Color.BLUE),
        null,
        Shader.TileMode.CLAMP
    ))
    setMaskFilter(BlurMaskFilter(20f, BlurMaskFilter.Blur.NORMAL))
}

Пример использования Paint с Canvas

Рассмотрим полный пример кастомного View, который рисует окружность с градиентной заливкой и текстовой подписью. Комбинация Paint и Canvas позволяет создавать сложную графику с минимальным кодом. Все настройки вынесены в инициализацию для производительности.

kotlin
class GradientCircleView@JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null
) : View(context, attrs) {

    private val fillPaint = Paint().apply {
        setShader(RadialGradient(
            0f, 0f, 200f,
            intArrayOf(Color.CYAN, Color.DKGRAY),
            null, Shader.TileMode.CLAMP
        ))
    }

    private val textPaint = Paint().apply {
        setColor(Color.WHITE)
        setTextSize(TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_SP, 24f, resources.displayMetrics
        ))
        setTextAlign(Paint.Align.CENTER)
        setMaskFilter(BlurMaskFilter(5f, BlurMaskFilter.Blur.NORMAL))
    }

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        canvas.drawCircle(200f, 200f, 150f, fillPaint)
        canvas.drawText("Gradient", 200f, 210f, textPaint)
    }
}

В коде используются два отдельных объекта Paint: один для заливки круга радиальным градиентом, второй для текста с тенью через BlurMaskFilter. Такое разделение позволяет независимо настраивать параметры и избегать сброса состояния Paint между отрисовкой разных типов элементов. Для повышения производительности оба Paint создаются в конструкторе, а не в onDraw.

При масштабировании на устройствах с разной плотностью пикселей значения размеров должны быть пересчитаны через TypedValue.applyDimension. Без этого текст и градиент будут выглядеть по-разному на mdpi и xxxhdpi экранах. В примере размер текста задаётся в sp, что автоматически адаптируется к системным настройкам размера шрифта пользователя.

Часто задаваемые вопросы

Чем отличается Paint от Canvas?

Canvas выполняет операции рисования (drawCircle, drawLine), а Paint определяет стиль — цвет, толщину, шрифт. Canvas не содержит настроек стиля, поэтому без Paint любая операция рисования не имеет визуального эффекта.

Можно ли использовать один Paint для разных фигур?

Да, один объект Paint можно переиспользовать для множества фигур. Рекомендуется создавать отдельные Paint для разных типов элементов (фон, текст, контур), но не для каждой фигуры — это снижает нагрузку на сборщик мусора.

Как сбросить Paint до настроек по умолчанию?

Метод reset возвращает Paint в состояние, эквивалентное новому экземпляру. Альтернативно можно использовать set с флагом, но reset предпочтительнее для читаемости кода. После сброса все стилевые параметры принимают значения по умолчанию.

Влияет ли Paint на производительность в onDraw?

Создание Paint внутри onDraw вызывает аллокацию в каждом кадре, что приводит к GC-фризам. Все объекты Paint должны создаваться в конструкторе View. Изменение параметров в onDraw через сеттеры безопасно и не создаёт новых объектов.

Как сделать прозрачный фон у текста в Paint?

Текст в Android всегда рисуется с прозрачным фоном. Метод drawText выводит только глифы, без фонового прямоугольника. Если нужен фон под текстом, сначала нарисуйте прямоугольник через drawRoundRect с отдельным Paint, а затем текст.

Итоги

  • Paint — конфигурационный класс для стилизации графики на Canvas, определяющий цвет, толщину, шрифт и эффекты.
  • setColor и setAlpha управляют цветом и прозрачностью с минимальными накладными расходами.
  • Style (FILL, STROKE, FILL_AND_STROKE) определяет, рисуется контур, заливка или оба варианта.
  • Typeface и setTextSize отвечают за шрифты с поддержкой Downloadable Fonts и адаптацией под экраны.
  • Shader — LinearGradient, RadialGradient, BitmapShader — добавляют градиенты и текстуры.
  • Создавайте Paint в конструкторе View, а не в onDraw, для предотвращения GC-фризов.
  • Разделяйте Paint по типам элементов: заливка, контур, текст — для гибкой настройки и читаемости кода.

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также