Как работает 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 он даёт разработчику полный контроль над графикой.