我正在使用自定义视图,我想使用path.lineTo()
和path.arcTo()
方法构建一个圆角矩形。
因此,我要获取的矩形:
通常我用以下代码块来绘制它:
RectF backReftf = new RectF();
Path path = new Path();
int width = getWidth();
int height = getHeight();
float curve = (float) (0.1 * height);
RectF backReftf = new RectF();
backReftf.left = 0;
backReftf.top = 0;
backReftf.right = width;
backReftf.bottom = height;
path.addRoundRect(backReftf, curve, curve, Path.Direction.CW);
canvas.drawPath(path, paint);
但是我想用path.lineTo()
和path.arcTo()
来绘制。
根据有关arcTo()
的文档:
将指定的弧形作为新轮廓附加到路径上。如果路径的起点与路径的当前最后一个点不同,则将添加自动lineTo()以将当前轮廓连接到弧的起点。但是,如果路径为空,则使用圆弧的第一点调用moveTo()。
所以从理论上讲,我的弧线应该从此处开始,直线终止于此,因此,如果我绘制了一条直线(矩形的左侧):
float curve = (float) (0.1 * height);
path.moveTo(0,0);
path.lineTo(0, height - curve);
然后,我的弧应从该点(0,高度-曲线)开始,但是当arcTo()
具有以下参数时,我应该在哪里传递这些参数:arcTo (float left,
float top,
float right,
float bottom,
float startAngle,
float sweepAngle,
boolean forceMoveTo)
?
加上在这种情况下如何计算startAngle
和sweepAngle
?
谢谢!
答案 0 :(得分:2)
绘制圆弧时,需要指定该圆弧的完整边界框以及起始角和后掠角。我尝试以视觉方式看到它们,就像这样:
例如顺时针旋转时,起始角度与原点成180度。从startAngle开始,如果您顺时针旋转90度,您将最终到达所需的最终位置。
请注意此图形中原点,startAngle和sweepAngle的位置。 在Kotlin中,它可能看起来像这样:
// Given some radius, viewWidth and viewHeight
override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
path.apply {
moveTo(radius, 0F)
lineTo(viewWidth - radius, 0F)
arcTo(viewWidth - 2 * radius, 0F, viewWidth, 2 * radius, -90F, 90F, false)
lineTo(viewWidth, radius)
arcTo(viewWidth - 2 * radius, viewHeight - 2 * radius, viewWidth, viewHeight, 0F, 90F, false)
lineTo(radius, viewHeight)
arcTo(0F, viewHeight - 2 * radius, 2 * radius, viewHeight, 90F, 90F, false)
lineTo(0F, radius)
arcTo(0F, 0F, 2 * radius, 2 * radius, 180F, 90F, false)
}
canvas?.drawPath(path, linePaint)
}
结果将是这样的: