如何在Jetpack Compose中绘制竖向票券形状
修复垂直票券形状的左右边缘半圆绘制问题
你的代码主要问题在于路径衔接冗余和圆弧角度参数错误,导致半圆方向不对、路径衔接异常。以下是修改后的代码:
private fun getTicketPathVertical(size: Size, density: Density): Path { val middleY = size.height / 2f val circleRadiusInPx = with(density) { circleRadius.toPx() } return Path().apply { reset() // 起点定位到左上角 moveTo(0F, 0F) // 绘制顶部边缘:左上角→右上角 lineTo(size.width, 0F) // 从右上角到右侧半圆的上起点 lineTo(size.width, middleY - circleRadiusInPx) // 绘制右侧中间的向内半圆 arcTo( rect = Rect( left = size.width - circleRadiusInPx * 2, top = middleY - circleRadiusInPx, right = size.width, bottom = middleY + circleRadiusInPx ), startAngleDegrees = 270f, // 起始角度指向正上方 sweepAngleDegrees = 180f, // 顺时针扫180度,形成向内凹陷的半圆 forceMoveTo = false ) // 从右侧半圆下起点到右下角 lineTo(size.width, size.height) // 绘制底部边缘:右下角→左下角 lineTo(0F, size.height) // 从左下角到左侧半圆的下起点 lineTo(0F, middleY + circleRadiusInPx) // 绘制左侧中间的向内半圆 arcTo( rect = Rect( left = 0F, top = middleY - circleRadiusInPx, right = circleRadiusInPx * 2, bottom = middleY + circleRadiusInPx ), startAngleDegrees = 90f, // 起始角度指向正下方 sweepAngleDegrees = 180f, // 顺时针扫180度,形成向内凹陷的半圆 forceMoveTo = false ) // 从左侧半圆上起点回到左上角,闭合路径 lineTo(0F, 0F) close() // 确保路径完全闭合,消除边缘缺口 } }
关键修改点:
- 移除了重复的
lineTo(x = 0F, y = size.height)调用,避免路径冗余混乱 - 调整右侧圆弧的
sweepAngleDegrees为180f(原代码-180f是逆时针绘制,会形成向外凸的圆弧),改为顺时针绘制向内凹陷的半圆 - 修正左侧圆弧的起始衔接点:从
middleY改为middleY + circleRadiusInPx,确保线条与圆弧起点精准衔接 - 同样调整左侧圆弧的
sweepAngleDegrees为180f,配合起始角度形成正确的向内半圆 - 添加
close()方法,确保路径完全闭合,避免绘制时出现边缘缺口
内容的提问来源于stack exchange,提问作者Serhat
相关产品推荐
相关产品推荐

