【问题标题】:SkiaSharp: Unexpected results with ArcTo() and Close()SkiaSharp:ArcTo() 和 Close() 的意外结果
【发布时间】: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() 不会生成笔画)。

标签: xamarin.forms skiasharp


【解决方案1】:

Close 转到当前轮廓的起点

代替

path.ArcTo(rc, 0, 90, true);

你想要

path.ArcTo(rc, 0, 90);

path.ArcTo(rc, 0, 90, false);

对所有ArcTo 调用进行此更改。

原因:

  • 最终参数“true”告诉它开始一个新的contour

Three ways to Draw an Arc中所述:

public void ArcTo (SKRect oval, Single startAngle, Single sweepAngle, Boolean forceMoveTo)

最后一个参数称为 forceMoveTo,它有效地在弧的开始处引起 MoveTo 调用。这开始了一个新的contour

【讨论】:

  • 谢谢!同时,我还尝试了 path.ArcTo(r, r, 0, SKPathArcSize.Small, SKPathDirection.Clockwise, X, Y);并发现它“工作”
  • @dlchambers - 当然,您可以长期使用任何未指定开始新轮廓的变体;)
  • 既然你已经解释过了,我对“forceMoveTo”的误用是完全有道理的。我误解了文档对参数的解释。
猜你喜欢
  • 2011-08-07
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 2021-09-07
  • 2017-04-24
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
相关资源
最近更新 更多