是否有一种简单的方法来处理(转换)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();
简而言之,我需要绘制一个复杂对象(箭头),它由一定数量的对象组成,例如,像五(或更多)行。更重要的是,该对象必须 转换 具有特定(动态)坐标(可能包括缩放)。
我的问题是 SkiaSharp 是否有任何我可以用来操纵这个复杂对象转换的东西(某种grouping 等)还是我仍然需要手动计算每个点(例如使用矩阵)。
这个问题与 SkiaSharp
特别相关,因为我在 Xamarin 上使用它,但也许 Skia
的一些一般性答案也可以帮助解决这个问题?
我想,这个问题可能太常见了(可能不完全适用于 Whosebug),但我在 google. 中找不到任何具体信息
是的,我知道如何使用 SkiaSharp 绘制图元。
创建一个 SKPath 并向其添加线条和其他形状
SKPath path = new SKPath();
path.LineTo(...);
...
...
然后在 canvas
上绘制 SKPathcanvas.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();