Это правильный способ (единственный способ, я думаю).
Это не так неэффективно, так как вы не вращаете холст, а корректируете матрицу рисования (массив 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);
Спасибо, Мэтью, это потрясающе. Я очень рад этой Ские. Он выглядит действительно многообещающим и мощным. – Vahid