2017-01-28 4 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

Спасибо, Мэтью, это потрясающе. Я очень рад этой Ские. Он выглядит действительно многообещающим и мощным. – Vahid

1

Вы можете нарисовать текст вдоль путь в 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(); 
} 

использовать MeasureText, чтобы г et length текста и использовать его для размещения в центре либо путем определения длины диагонального пути и установки значения начальной точки в параметрах DrawTextOnPath, либо установки пути, отличного от 0,0 (как в примере)

Я не уверен, что он более эффективен, чем вращение холста, хотя это кажется более «очевидным» способом рисования.

+0

Спасибо, я сделаю тест производительности на этом. – Vahid

+0

@Vahid, как прошел перфекционный тест? – gbjbaanb

Смежные вопросы