【发布时间】:2021-07-28 03:29:44
【问题描述】:
我正在 Android 11 下的 SKCanvasView (Xamarin.Forms) 上使用 SkiaSharp 绘制一些线条和弧线。
我创建了 SKPath,它大部分都按预期呈现,但我发现 Close() 笔划总是在 最后添加的弧的起点结束,而不是在路径中的第一个点。
代码:
SKPoint pt = new SKPoint(600, 400); // Random location
float r = 100; // Arc radius
float d = 2 * r; // Side of arc rect
SKRect rc = new SKRect(pt.X, pt.Y, pt.X + d, pt.Y + d);
SKPath path = new SKPath();
path.MoveTo(rc.Right + 50, rc.Top);
path.LineTo(rc.Right, rc.MidY); // Line "S"
path.ArcTo(rc, 0, 90, true); // Arc "A"
path.ArcTo(rc, 90, 90, true); // Arc "B"
path.ArcTo(rc, 180, 90, true); // Arc "C"
path.Close(); // Line "K"
using (var skp = new SKPaint() { Style=SKPaintStyle.Stroke, IsAntialias=true, Color=SKColors.Red, StrokeWidth=6 }) {
canv.DrawPath(path, skp);
}
这是结果(添加了非红色项目以进行说明)。
我不明白的是为什么path.Close() 导致行“K”在 B/C 接合处而不是在“S”的起点处结束。我希望 Close() 生成行“G”(当然是红色)而不是“K”。
任何见解将不胜感激!
【问题讨论】:
-
来自
Close()的文档-“如果当前点不等于轮廓的第一个点,则会自动添加一条线段。” -
@Jason 明白了。在最后的 ArcTo() 之后,路径的 LastPoint 是 C/K 接合点,正如预期的那样。此外,如果我在最后一个 ArcTo() 之后调用 LineTo(somewhere),则该附加线将从 C 的末尾绘制到“某处”,正如预期的那样。如果我随后调用 Close(),那么自动生成的笔画将仍然在 B/C 接合处结束,即使该行是“G”,明确地在“S”的原点结束(它应该关闭路径,因此 Close() 不会生成笔画)。