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

Posted

技术标签:

【中文标题】有没有一种简单的方法来处理(转换)SkiaSharp 中的一组对象?【英文标题】:Is there a simple way of handling (transforming) a group of objects in SkiaSharp? 【发布时间】:2020-09-21 11:07:13 【问题描述】:

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

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

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


我认为,这个问题可能太常见了(并且可能不完全适用于 ***),但我在谷歌中找不到任何具体信息。

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

【问题讨论】:

您可以对整个 SKPath 应用转换 @Jason,“整个 SKPath”是什么意思?我正在使用 canvas.DrawLine (... SKPaint) 来绘制对象的一部分。因此,必须将转换应用于这个特定的对象,当可能有一些其他对象使用自己的转换绘制时...... 首先,这就是为什么您需要在问题中显示代码,这样人们就知道您在做什么,而不必猜测 第二,“路径封装了由直线段、二次曲线和三次曲线组成的复合(多轮廓)几何路径。” docs.microsoft.com/en-us/dotnet/api/… 您可以用路径绘制一个箭头形状,然后对整个路径应用变换 【参考方案1】:

创建一个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);

【讨论】:

【参考方案2】:

如果您要绘制比路径更复杂的东西,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();

【讨论】:

以上是关于有没有一种简单的方法来处理(转换)SkiaSharp 中的一组对象?的主要内容,如果未能解决你的问题,请参考以下文章

有没有一种简单的方法可以通过名称(来自文本文件)来处理应用程序的变量?

有没有一种简单的方法可以将 C# 类转换为 PHP?

有没有一种简单的方法可以将 MySQL 数据转换为 Title Case?

c#有没有一种简单的方法将月份整数转换为名称

有没有一种简单的方法可以在 JavaScript 中将文本转换为 HTML? [复制]

有没有一种简单的方法可以将 BigQuery 中的行转换为 JSON?