Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Узнайте, как определить размер отрисоченной текстовой строки для интеграции текста с графикой SkiaSharp
В этой статье показано, как измерять текст, масштабировать текст до определенного размера и интегрировать текст с другими рисунками:

Это изображение также включает округленный прямоугольник. Класс SkiaSharp Canvas включает DrawRect методы рисования прямоугольника и DrawRoundRect методов для рисования прямоугольника с закругленными углами. Эти методы позволяют прямоугольнику определяться как SKRect значение или другими способами.
Страница "Кадрированный текст " центрирует короткую текстовую строку на странице и окружает ее кадром, состоящим из пары округленных прямоугольников. В FramedTextPage классе показано, как это сделать.
В SkiaSharp класс используется SKPaint для задания атрибутов текста и шрифта, но его также можно использовать для получения отрисованного размера текста. В начале следующего PaintSurface обработчика событий вызывается два разных MeasureText метода. Первый MeasureText вызов имеет простой string аргумент и возвращает ширину пикселя текста на основе текущих атрибутов шрифта. Затем программа вычисляет новое TextSize свойство SKPaint объекта на основе этой отрисовки ширины, текущего TextSize свойства и ширины области отображения. Это вычисление предназначено для задания TextSize , чтобы текстовая строка отображалась в 90 % ширины экрана:
void OnCanvasViewPaintSurface(object sender, SKPaintSurfaceEventArgs args)
{
SKImageInfo info = args.Info;
SKSurface surface = args.Surface;
SKCanvas canvas = surface.Canvas;
canvas.Clear();
string str = "Hello SkiaSharp!";
// Create an SKPaint object to display the text
SKPaint textPaint = new SKPaint
{
Color = SKColors.Chocolate
};
// Adjust TextSize property so text is 90% of screen width
float textWidth = textPaint.MeasureText(str);
textPaint.TextSize = 0.9f * info.Width * textPaint.TextSize / textWidth;
// Find the text bounds
SKRect textBounds = new SKRect();
textPaint.MeasureText(str, ref textBounds);
...
}
Второй MeasureText вызов имеет SKRect аргумент, поэтому он получает как ширину, так и высоту отрисованного текста. Height Свойство этого SKRect значения зависит от наличия прописных букв, возрастающих и нисходящих значений в текстовой строке. Для текстовых строк "мама", "кошка" и "собака", например, отображаются разные Height значения.
И LeftTop свойства SKRect структуры указывают координаты левого верхнего угла отрисованного текста, если текст отображается вызовом DrawText с позициями X и Y 0. Например, когда эта программа выполняется на симуляторе i Телефон 7, TextSize назначается значение 90,6254 в результате вычисления после первого вызоваMeasureText. Значение SKRect , полученное из второго вызова MeasureText , имеет следующие значения свойств:
Left= 6Top= –68Width= 664.8214Height= 88;
Помните, что координаты X и Y, которые передаются DrawText методу, указывают левую сторону текста на базовом уровне. Значение Top указывает, что текст расширяется на 68 пикселей выше базового плана и (вычитая 68 из 88) 20 пикселей ниже базового плана. Значение Left 6 указывает, что текст начинается шесть пикселей справа от значения X в вызове DrawText . Это позволяет нормально выполнять интервалы между символами. Если вы хотите отобразить текст в левом верхнем углу экрана, передайте отрицательные значения в LeftTop виде координат DrawTextX и Y в этом примере –6 и 68.
Структура SKRect определяет несколько удобных свойств и методов, некоторые из которых используются в оставшейся части обработчика PaintSurface . И MidXMidY значения указывают координаты центра прямоугольника. (В примере i Телефон 7 эти значения : 338,4107 и –24.) Следующий код использует эти значения для простого вычисления координат для центра текста на дисплее:
void OnCanvasViewPaintSurface(object sender, SKPaintSurfaceEventArgs args)
{
...
// Calculate offsets to center the text on the screen
float xText = info.Width / 2 - textBounds.MidX;
float yText = info.Height / 2 - textBounds.MidY;
// And draw the text
canvas.DrawText(str, xText, yText, textPaint);
...
}
Структура SKImageInfo сведений также определяет Rect свойство типа SKRect, поэтому вы также можете вычислить xText и yText , как показано ниже.
float xText = info.Rect.MidX - textBounds.MidX;
float yText = info.Rect.MidY - textBounds.MidY;
Обработчик PaintSurface завершается двумя вызовами DrawRoundRect, для которых требуются аргументы SKRect. Это SKRect значение основано на значении SKRect , полученном MeasureText из метода, но оно не может быть таким же. Во-первых, он должен быть немного больше, чтобы округленный прямоугольник не рисовал по краям текста. Во-вторых, он должен быть смещен в пространстве, чтобы Left и Top значения соответствовали верхнему левому углу, где прямоугольник должен быть расположен. Эти два задания выполняются с помощью методов, Inflate определенных следующими способами OffsetSKRect:
void OnCanvasViewPaintSurface(object sender, SKPaintSurfaceEventArgs args)
{
...
// Create a new SKRect object for the frame around the text
SKRect frameRect = textBounds;
frameRect.Offset(xText, yText);
frameRect.Inflate(10, 10);
// Create an SKPaint object to display the frame
SKPaint framePaint = new SKPaint
{
Style = SKPaintStyle.Stroke,
StrokeWidth = 5,
Color = SKColors.Blue
};
// Draw one frame
canvas.DrawRoundRect(frameRect, 20, 20, framePaint);
// Inflate the frameRect and draw another
frameRect.Inflate(10, 10);
framePaint.Color = SKColors.DarkBlue;
canvas.DrawRoundRect(frameRect, 30, 30, framePaint);
}
После этого оставшаяся часть метода прямо вперед. Он создает еще один SKPaint объект для границ и вызывает DrawRoundRect дважды. Во втором вызове используется прямоугольник, забитый еще на 10 пикселей. Первый вызов задает радиус угла в 20 пикселей. Второй имеет угловой радиус 30 пикселей, поэтому они, кажется, параллельны:
Вы можете повернуть телефон или симулятор в сторону, чтобы увидеть текст и кадр увеличение размера.
Если вам нужно только центрировать текст на экране, это можно сделать примерно без измерения текста. Вместо этого задайте TextAlign свойство SKPaint элемента SKTextAlign.Centerперечисления. Координата X, указанная в методе DrawText , указывает, где расположен горизонтальный центр текста. Если вы передаете середину экрана DrawText методу, текст будет горизонтально центрирован и почти по вертикали, так как базовый план будет по вертикали по центру.
Текст можно рассматривать так же, как и любой другой графический объект. Одним из простых вариантов является отображение контура текстовых символов:
Это можно сделать, просто изменив обычное Style свойство SKPaint объекта с его значения SKPaintStyle.FillSKPaintStyle.Strokeпо умолчанию и указав ширину штриха. Обработчик PaintSurface страницы "Контурированный текст" показывает, как это сделать:
void OnCanvasViewPaintSurface(object sender, SKPaintSurfaceEventArgs args)
{
SKImageInfo info = args.Info;
SKSurface surface = args.Surface;
SKCanvas canvas = surface.Canvas;
canvas.Clear();
string text = "OUTLINE";
// Create an SKPaint object to display the text
SKPaint textPaint = new SKPaint
{
Style = SKPaintStyle.Stroke,
StrokeWidth = 1,
FakeBoldText = true,
Color = SKColors.Blue
};
// Adjust TextSize property so text is 95% of screen width
float textWidth = textPaint.MeasureText(text);
textPaint.TextSize = 0.95f * info.Width * textPaint.TextSize / textWidth;
// Find the text bounds
SKRect textBounds = new SKRect();
textPaint.MeasureText(text, ref textBounds);
// Calculate offsets to center the text on the screen
float xText = info.Width / 2 - textBounds.MidX;
float yText = info.Height / 2 - textBounds.MidY;
// And draw the text
canvas.DrawText(text, xText, yText, textPaint);
}
Другим общим графическим объектом является растровое изображение. Это большая тема, подробно описанная в разделе SkiaSharp Bitmaps, но следующая статья, Bitmap Basics in SkiaSharp, содержит краткое введение.

