如何在SkiaSharp
中绘制旋转文本。
目前我是通过旋转SKCanvas
,绘制文本,然后再将其旋转回来。但我想可能有更有效的方法来实现这一点。
canvas.RotateDegrees(45, 20, 20);
canvas.DrawText("Text", 20, 20, paint);
canvas.RotateDegrees(-45, 20, 20);
这是正确的方式(我认为也是唯一的方式)。
实际上并不会像旋转画布那样效率低下,而是通过调整绘图矩阵(一个int[9]
数组)来实现。在底层,它会执行类似于以下操作:
var m = SKMatrix.CreateRotation(45); // simple struct over int[9]
canvas.CurrentMatrix.Concat(m) // simple multiplication
canvas.DrawText(text, matrix);
当你旋转回来时,它只是重新计算了数学运算。
另一种方法是保存画布,然后恢复:
canvas.Save();
canvas.Rotate(45);
canvas.DrawText(text);
canvas.Restore();
这只是在保存期间复制当前矩阵。当您恢复时,它只是还原它。在这种方法中,您可以进行一系列的转换,而无需反向操作,因此这是一种“更好”的方式。
或者,您可以使用方便的类型:
// auto save
using (new SKAutoCanvasRestore(canvas)) {
// do any transformations
canvas.Rotate(45);
// do serious work
canvas.DrawText(text);
// auto restore, even on exceptions or errors
}
还有一种完全不同的绘制文本的方法,就是沿着路径绘制:
var path = new SKPath();
// create path ...
// draw using path
canvas.DrawText("text", path, hOffset: 0, vOffset: 0, paint);
在 SkiaSharp 中,您可以沿着路径绘制文本,因此(例如)可以将文本对角线地绘制在图像上:
using (SKPaint skPaint = new SKPaint())
{
SKPath path = new SKPath();
path.MoveTo(original.Width / 10, original.Height - original.Height / 10);
path.LineTo(original.Width - original.Width / 10, original.Height / 10);
canvas.DrawTextOnPath(textToWrite, path, 0, 0, skPaint);
path.Dispose();
}