Промежуток между двумя рисунками в Jetpack compose Canvas

Я пытаюсь сделать прямоугольник и дугу, прикрепленную к основанию прямоугольника. Я использовал размер, предоставляемый drawScope, для размещения рисунков на экране, но я не могу понять, почему между двумя рисунками существует ненужный промежуток, даже если указанный параметр дуги topLeft равен высоте нарисованного прямоугольника.

      Canvas(
        modifier = Modifier.fillMaxWidth()
            .height(200.dp)
    ){

        drawRect(
            color = Color(0xFFEF3125),
            topLeft = Offset(0f, 0f),
            size = Size(this.size.width, this.size.height.times(0.75f))
        )

        drawArc(
            color = Color(0xFFEF3125),
            startAngle = 0f,
            sweepAngle = 180f,
            useCenter = false,
            topLeft = Offset(
                0f, this.size.height.times(0.75f)
            )
        )
    }

1 ответ

Существует зазор, потому что когда вы рисуете дугу, вы используете прямоугольник в качестве ссылки, но вы рисуете дугу до половины этого прямоугольника, поэтому вам нужно сместиться вверх на половину высоты прямоугольника, в который вы рисуете дугу.

      @Composable
private fun ArcSample() {
    Canvas(
        modifier = Modifier.fillMaxWidth()
            .height(200.dp)
    ){

        drawRect(
            color = Color(0xFFEF3125),
            size = Size(this.size.width, this.size.height.times(0.75f)),
            style = Stroke(4.dp.toPx())
        )


        drawArc(
            color = Color(0xFFEF3125),
            startAngle = 0f,
            sweepAngle = 180f,
            useCenter = false,
            size = Size(size.width, size.height.times(.25f)),
            topLeft = Offset(
                0f, this.size.height.times(0.625f)
            ),
            style = Stroke(4.dp.toPx())
        )
    }
}

Я использовал стиль Stroke, чтобы показать границы, это для демонстрации.

      @Composable
private fun ArcSample2() {
    Canvas(
        modifier = Modifier.fillMaxWidth()
            .height(200.dp)
    ){

        drawRect(
            color = Color(0xFFEF3125),
            size = Size(this.size.width, this.size.height.times(0.75f))
        )


        val sizeCoefficient = 0.25f

        drawArc(
            color = Color(0xFFEF3125),
            startAngle = 0f,
            sweepAngle = 360f,
            useCenter = false,
            size = Size(size.width, size.height.times(sizeCoefficient)),
            topLeft = Offset(
                0f, this.size.height.times(0.75f-sizeCoefficient/2f)
            )
        )
    }
}

Другие вопросы по тегам