简而言之,我需要绘制一个复杂对象(箭头(,它由一定数量的对象组成,例如五条(或更多(线。更重要的是,必须用特定的(动态(坐标(可能包括缩放(变换该对象。
我的问题是,SkiaSharp是否有任何东西可以用于操作这个复杂的对象变换(某种分组等(,或者我是否仍然需要手动计算每个点(例如,使用矩阵(。
这个问题特别与SkiaSharp
有关,因为我在Xamarin上使用了它,但也许Skia
的一些一般答案也可以帮助解决这个问题?
我认为,这个问题可能太常见了(可能不适合stackoverflow(,但我在谷歌上找不到任何具体信息
是的,我知道如何使用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();