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

Is there a simple way of handling (transforming) a group of objects in SkiaSharp?

简而言之,我需要绘制一个复杂对象(箭头),它由一定数量的对象组成,例如,像五(或更多)行。更重要的是,该对象必须 转换 具有特定(动态)坐标(可能包括缩放)。

我的问题是 SkiaSharp 是否有任何我可以用来操纵这个复杂对象转换的东西(某种grouping 等)还是我仍然需要手动计算每个点(例如使用矩阵)。

这个问题与 SkiaSharp 特别相关,因为我在 Xamarin 上使用它,但也许 Skia 的一些一般性答案也可以帮助解决这个问题?


我想,这个问题可能太常见了(可能不完全适用于 Whosebug),但我在 google. 中找不到任何具体信息

是的,我知道如何使用 SkiaSharp 绘制图元。

创建一个 SKPath 并向其添加线条和其他形状

SKPath path = new SKPath();
path.LineTo(...);
... 
...

然后在 canvas

上绘制 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;
    }
}

然后将变换应用到 canvas,绘制图片并恢复 canvas 状态。 offsetX 和 offsetY 对应于将呈现 SKPicture 的原点。

canvas.Save();
canvas.Translate(offsetX, offsetY);
canvas.Scale(scaleAmount);
canvas.RotateDegrees(degrees);
canvas.DrawPicture(MyPicture);
canvas.Restore();