Как работает Canvas в Android?

Canvas в Android — это класс для рисования графики на экране. Он предоставляет низкоуровневый API, позволяющий рисовать прямоугольники, линии, текст, изображения, дуги, пути и другие фигуры вручную. Работает он совместно с объектами Paint (стилизация), Path (многоугольники и кривые), Bitmap и другими.

Canvas чаще всего используется при:

  • Создании **кастомных View
    **
  • Рендеринге **анимации вручную
    **
  • Отрисовке **графиков, визуализаций, игр
    **
  • Рисовании **на Bitmap
    **

📐 Принцип работы

Canvas — это поверхность, на которую можно рисовать. Но сам по себе Canvas не отображается — он лишь объект, связанный с областью рисования, такой как:

  • View → при переопределении onDraw()

  • Bitmap → при создании Canvas(bitmap)

  • SurfaceView → при работе в отдельном потоке

🔧 Пример: кастомная View

class MyView(context: Context) : View(context) {
private val paint = Paint().apply {
color = Color.RED
strokeWidth = 5f
}
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
canvas.drawLine(0f, 0f, width.toFloat(), height.toFloat(), paint)
canvas.drawRect(50f, 50f, 200f, 200f, paint)
canvas.drawText("Hello Canvas", 100f, 300f, paint)
}
}

Метод onDraw() автоматически вызывается системой при необходимости перерисовки (например, при invalidate()).

🎨 Основные методы Canvas

Метод Назначение
drawLine(x1, y1, x2, y2) Рисует линию
--- ---
drawRect(left, top, right, bottom) Рисует прямоугольник
--- ---
drawCircle(cx, cy, radius) Рисует круг
--- ---
drawText(text, x, y) Рисует текст
--- ---
drawBitmap(bitmap, x, y) Рисует изображение
--- ---
drawPath(path) Рисует произвольную форму
--- ---
drawArc(...) Рисует дугу или сектор
--- ---

Все методы требуют объект Paint — в нём задаются цвет, стиль заливки, обводка, тип шрифта и пр.

Paint — стилизация объектов

val paint = Paint().apply {
color = Color.BLUE
style = Paint.Style.STROKE // или FILL
strokeWidth = 10f
isAntiAlias = true
textSize = 40f
}

Работа с invalidate()

Чтобы перерисовать Canvas, нужно вызвать:

invalidate() // запрос на перерисовку

Это приведёт к вызову onDraw(Canvas) и обновлению экрана.

Рисование на Bitmap

Можно рисовать не на экране, а на изображении, которое потом сохраняется или используется:

val bitmap = Bitmap.createBitmap(500, 500, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
val paint = Paint().apply { color = Color.GREEN }
canvas.drawCircle(250f, 250f, 100f, paint)
// сохранить bitmap или отобразить в ImageView

Работа с transform-операциями

Canvas поддерживает преобразования координат:

canvas.translate(50f, 50f) // смещение
canvas.rotate(45f) // поворот
canvas.scale(2f, 2f) // масштаб
canvas.skew(0.5f, 0f) // искажение
canvas.save() // сохранить текущее состояние
// ... рисование
canvas.restore() // вернуть состояние

Когда использовать Canvas

  • Кастомные элементы управления (например, круговой прогресс).

  • Графики, шкалы, диаграммы.

  • UI с необычными формами, анимацией, не реализуемой стандартными View.

  • 2D-игры и визуализации.

Особенности

  • Canvas вызывается только из главного потока при работе с View.

  • Для высокой производительности на сложной графике используют SurfaceView или OpenGL.

  • Переотрисовка — дорогостоящая операция, избегайте ненужного invalidate().

Итого

Canvas в Android — это инструмент для низкоуровневой графической отрисовки. С его помощью можно вручную нарисовать любую фигуру или изображение, кастомизировать внешний вид компонентов и создавать уникальный интерфейс. В паре с Paint, Path и Bitmap он даёт разработчику полный контроль над графикой.