如何解决SkiaSharp:ArcTo() 和 Close() 的意外结果
我正在 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,90,true); // Arc "A"
path.ArcTo(rc,true); // Arc "B"
path.ArcTo(rc,180,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
转到当前轮廓的起点。
代替
path.ArcTo(rc,90,true);
你想要
path.ArcTo(rc,90);
或
path.ArcTo(rc,false);
对所有这些 ArcTo
调用进行此更改。
原因:
- 最后一个参数“true”告诉它开始一个新的
contour
!
如Three ways to Draw an Arc中所述:
public void ArcTo (SKRect oval,Single startAngle,Single sweepAngle,Boolean forceMoveTo)
最后一个参数称为 forceMoveTo,它有效地在弧的开始处调用 MoveTo。这开始了一个新的 contour
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。