Jetpack Compose в корне меняет способ разработки пользовательских интерфейсов на Android. Одной из его функций является API Canvas. Она позволяет разработчикам создавать пользовательские фигуры, контуры и графику. Рассмотрим 10 практических примеров использования API Canvas в Jetpack Compose.

1. Рисование круга

Начнем с чего-нибудь простого  —  нарисуем круг.

@Composable
fun DrawCircle() {
Canvas(
modifier = Modifier
.size(200.dp)
.background(Color.White)
.border(2.dp, color = Color.Blue)
) {
drawCircle(color = Color.Red, radius = 100f)
}
}

2. Рисование прямоугольника

Нарисовать прямоугольник так же просто.

@Composable
fun DrawRectangle() {
Canvas(
modifier = Modifier
.size(200.dp)
.background(Color.White)
.border(2.dp, color = Color.Blue)
) {
drawRect(color = Color.Green, size = size)
}
}

3. Построение линии

Для построения линии требуется две точки: начальная и конечная.

@Composable
fun DrawLine() {
Canvas(
modifier = Modifier
.size(200.dp)
.background(Color.White)
.border(2.dp, color = Color.Red)
) {
drawLine(
color = Color.Blue,
start = Offset.Zero,
end = Offset(size.width, size.height),
strokeWidth = 4f
)
}

4. Создание текста

Можно также создать текст на холсте.

@Composable
fun DrawCanvasText() {
val paint = Paint().asFrameworkPaint().apply {
// paint configuration
this.textSize = 60f
}
Canvas(
modifier = Modifier
.size(200.dp)
.background(Color.White)
.border(2.dp, color = Color.Red)
) {
drawIntoCanvas {
it.nativeCanvas.drawText("Hello, Canvas!", 20f, 200f, paint)
}
}
}

5. Создание контура

Контур  —  это серия соединенных линий и кривых. Вот как нарисовать простой треугольник с помощью контура.

@Composable
fun DrawTriangle() {
Canvas(
modifier = Modifier
.size(200.dp)
) {
val path = Path().apply {
moveTo(size.width / 2, 0f)
lineTo(size.width, size.height)
lineTo(0f, size.height)
close()
}
drawPath(path = path, color = Color.Magenta)
}
}

6. Рисование дуги

Дуга  —  это сегмент окружности. Можно нарисовать дугу, указав начальный угол и угол поворота.

@Composable
fun DrawArc() {
Canvas(modifier = Modifier.size(200.dp)) {
drawArc(
color = Color.Cyan,
startAngle = 0f,
sweepAngle = 270f,
useCenter = true,
topLeft = Offset.Zero,
size = size
)
}
}

7. Применение техники отсекания

Можно применить технику отсекания, чтобы ограничить область рисования на холсте. Вот пример применения кругового отсекания.

@Composable
fun ApplyClip() {
Canvas(modifier = Modifier.size(200.dp)) {
clipPath(Path().apply { addOval(Rect(Offset.Zero, size)) }) {
drawRect(color = Color.Yellow)
}
}
}

8. Применение техники трансформации

Можно применить технику трансформации на холсте, чтобы изменить способ выполнения последующих операций рисования. Вот пример применения вращения.

@Composable
fun ApplyTransform() {
Canvas(modifier = Modifier.size(200.dp)) {
rotate(45f) {
drawRect(color = Color.Blue)
}
}

9. Рисование с использованием шейдера

Шейдер  —  это инструмент для определения цвета каждого пикселя при рисовании. Вот пример рисования с помощью линейного градиентного шейдера.

@Composable
fun DrawWithShader() {
Canvas(modifier = Modifier.size(200.dp)) {
val shader = Brush.linearGradient(
colors = listOf(Color.Red, Color.Blue),
start = Offset.Zero,
end = Offset(size.width, size.height)
)
drawRect(brush = shader)
}
}

10. Настройка индикатора выполнения

В этом примере CircularProgress  —  это composable, который принимает значение прогресса выполнения от 0 до 1 и рисует круговой индикатор выполнения. Индикатор выполнения (progress bar) рисуется с помощью функции drawArc, которая создает дугу от начального угла до начального угла плюс угол поворота.

@Composable
fun CircularProgress(progress: Float) {
val stroke = 8.dp
val color = Color.Blue
Canvas(modifier = Modifier.size(100.dp)) {
val innerRadius = (size.minDimension - stroke.toPx()) / 2
val halfSize = size / 2.0f
val topLeft = Offset(
x = halfSize.width - innerRadius,
y = halfSize.height - innerRadius
)
val size = Size(
width = innerRadius * 2,
height = innerRadius * 2
)
val startAngle = -90f
val sweep = progress * 360f
drawArc(
color = color,
startAngle = startAngle,
sweepAngle = sweep,
topLeft = topLeft,
size = size,
useCenter = false,
style = Stroke(width = stroke.toPx())
)
}
}

В заключение следует отметить, что API Canvas в Jetpack Compose предлагает широкий спектр возможностей по созданию пользовательских рисунков. Что бы вы ни разрабатывали  —  пользовательское представление, игру или визуализацию данных,  —  API Canvas обеспечит необходимую гибкость и контроль. Так что вперед, начинайте рисовать!

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

Читайте нас в Telegram, VK и Дзен


Перевод статьи Android-World: Jetpack Compose Canvas: 10 Practical Examples

Предыдущая статьяПроблема устаревших замыканий и способы ее решения в React. Часть 1
Следующая статья23 шаблона проектирования для 99% разработчиков на Java