问题描述
简而言之,假设我需要绘制一个复杂对象(箭头),其中包含一定数量的对象,例如五(或更多)行,例如。而且更重要的是,必须使用特定的(动态)坐标(包括可能的缩放比例)对对象进行变换。
我的问题是 SkiaSharp是否有我可以用来操纵这种复杂对象转换的任何东西(某种分组等)?还是我仍然需要手动计算每个点(例如,使用矩阵)。
这个问题与我在Xamarin上使用的SkiaSharp
特别相关,但是也许来自Skia
的一些一般答案也可以帮助解决这个问题?
我认为,这个问题可能太普遍了(可能并非完全针对stackoverflow),但是我只是无法在Google中找到任何特定信息。
是的,我知道如何使用SkiaSharp绘制图元。
解决方法
创建一个SKPath并为其添加线条和其他形状
SKPath path = new SKPath();
path.LineTo(...);
...
...
然后在画布上绘制SKPath
canvas.DrawPath(path,paint);
您可以在绘制之前将变换应用于整个路径
var rot = new SKMatrix();
SKMatrix.RotateDegrees(ref rot,45.0f);
path.Transform(rot);
,
如果您要绘制比路径更复杂的内容,SKPicture 非常适合此操作。您可以对其进行设置,以便您构建一次,然后轻松高效地重用它。在下面的示例中,SKPicture 的原点位于 100 x 100 矩形的中心,但这是任意的。
SKPicture myPicture;
SKPicture MyPicture {
get {
if(myPicture != null) {
return myPicture;
}
using(SKPictureRecorder recorder = new SKPictureRecorder())
using(SKCanvas canvas = recorder.BeginRecording(new SKRect(-50,-50,50,50)))
// draw using primitives
...
myPicture = recorder.EndRecording();
}
return myPicture;
}
}
然后将变换应用到画布,绘制图片并恢复画布状态。 offsetX 和 offsetY 对应于渲染 SKPicture 的原点。
canvas.Save();
canvas.Translate(offsetX,offsetY);
canvas.Scale(scaleAmount);
canvas.RotateDegrees(degrees);
canvas.DrawPicture(MyPicture);
canvas.Restore();