2017-01-28 83 views
2

如何在SkiaSharp中繪製旋轉文字。在SkiaSharp中繪製旋轉文字

目前我正在旋轉SKCanvas,繪製文本然後旋轉回來。但我認爲可能有一個更有效的方法來做到這一點。

canvas.RotateDegrees(45, 20, 20); 
    canvas.DrawText("Text", 20, 20, paint); 
    canvas.RotateDegrees(-45, 20, 20); 

回答

2

這是正確的方法(我認爲唯一的方法)。

這並不是沒有效率,因爲您並不是真的在旋轉畫布,而是在調整繪圖矩陣(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); 
+0

謝謝馬修,這太棒了。我對這個Skia非常興奮。它看起來非常有前途和強大。 – Vahid

1

可以繪製文本一起(例如)在圖像上對角地繪製文本:

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之外的路徑原點(正如我在示例中所做的那樣) )

我不確定它是否比旋轉畫布效率更高,但它似乎是一種更明顯的繪畫方式。

+0

謝謝我會對此做一個性能測試。 – Vahid

+0

@Vahid性能測試怎麼樣? – gbjbaanb