如何在SkiaSharp
中繪製旋轉文字。在SkiaSharp中繪製旋轉文字
目前我正在旋轉SKCanvas
,繪製文本然後旋轉回來。但我認爲可能有一個更有效的方法來做到這一點。
canvas.RotateDegrees(45, 20, 20);
canvas.DrawText("Text", 20, 20, paint);
canvas.RotateDegrees(-45, 20, 20);
如何在SkiaSharp
中繪製旋轉文字。在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);
可以繪製文本一起(例如)在圖像上對角地繪製文本:
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();
}
使用MeasureText以g通過計算對角線路徑的長度並在DrawTextOnPath參數中設置起點值或設置除0,0之外的路徑原點(正如我在示例中所做的那樣) )
我不確定它是否比旋轉畫布效率更高,但它似乎是一種更明顯的繪畫方式。
謝謝馬修,這太棒了。我對這個Skia非常興奮。它看起來非常有前途和強大。 – Vahid