SkiaSharp中是否有一种简单的方法来处理转换一组对象?

问题描述

简而言之,假设我需要绘制一个复杂对象(箭头),其中包含一定数量的对象,例如五(或更多)行,例如。而且更重要的是,必须使用特定的(动态)坐标(包括可能的缩放比例)对对象进行变换

我的问题是 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();