Я работаю с библиотекой Skiasharp и пишу этот основной код для рендеринга текста: < /p>
private void SendText(OggettoLayout oggetto, SKCanvas canvas, float dpi, bool antialiasingOff)
{
if (oggetto.StileTesto == null)
throw new Exception(RenderMessages.LayoutNonValido);
if (oggetto.StileTesto.IsNullHide && string.IsNullOrWhiteSpace(oggetto.Valore))
return;
canvas.Save();
var text = oggetto.Valore ?? (oggetto.StileTesto.IsNullError ? "##VALORENULL##" : "");
float xDpi = oggetto.X * dpi;
float yDpi = oggetto.Y * dpi;
float widthDpi = oggetto.Larghezza * dpi;
float heightDpi = oggetto.Altezza * dpi;
var textContainer = new SKRect(xDpi, yDpi, xDpi + widthDpi, yDpi + heightDpi);
var font = GetFont(oggetto, widthDpi, heightDpi, dpi);
var paint = new SKPaint
{
IsAntialias = !antialiasingOff,
Color = oggetto.StileTesto.Colore?.FromRgbaToSKColor() ?? SKColors.Black,
IsStroke = false
};
float textWidth = font.MeasureText(text, out SKRect bounds);
float offsetX = textContainer.Left;
float offsetY = textContainer.Top;
switch (oggetto.StileTesto.Allineamento)
{
case AllineamentoTesto.Center:
offsetX += (textContainer.Width - bounds.Width) / 2;
break;
case AllineamentoTesto.Right:
offsetX += textContainer.Width - bounds.Width;
break;
}
switch (oggetto.StileTesto.AllineamentoVerticale)
{
case AllineamentoVerticale.Top:
offsetY += font.Size * 0.15f - bounds.Top;
break;
case AllineamentoVerticale.Center:
offsetY += (textContainer.Height - bounds.Height) / 2 - bounds.Top;
break;
case AllineamentoVerticale.Bottom:
offsetY += textContainer.Height - bounds.Bottom - font.Size * 0.25f;
break;
}
if (_rotate180)
{
canvas.Translate(textContainer.MidX, textContainer.MidY);
canvas.RotateDegrees(180);
canvas.Translate(-textContainer.MidX, -textContainer.MidY);
}
if (oggetto.Orientamento > 0)
{
canvas.Translate(textContainer.MidX, textContainer.MidY);
canvas.RotateDegrees(oggetto.Orientamento);
canvas.Translate(-textContainer.MidX, -textContainer.MidY);
}
if (oggetto.Raggio > 0)
{
using var path = RoundedRectangle(textContainer, oggetto.Raggio * dpi);
canvas.ClipPath(path);
}
else
{
canvas.ClipRect(textContainer);
}
if (oggetto.StileTesto.IsMultiLine)
{
if (oggetto.StileTesto.Allineamento == AllineamentoTesto.Justify)
{
DrawJustifiedText(text, textWidth, font, textContainer, oggetto, canvas, paint, offsetY);
}
else
{
DrawMultilineText(text, textWidth, font, textContainer, offsetX, oggetto, canvas, paint, offsetY);
}
}
else
{
canvas.DrawText(text, offsetX, offsetY, font, paint);
if (oggetto.StileTesto.IsUnderline)
{
using var underlinePaint = new SKPaint
{
Style = SKPaintStyle.Stroke,
Color = paint.Color,
StrokeWidth = font.Size * 0.07f,
IsAntialias = true
};
float underlineY = offsetY + font.Size * 0.1f;
canvas.DrawLine(offsetX, underlineY, offsetX + bounds.Width, underlineY, underlinePaint);
}
}
canvas.Restore();
//canvas.ResetMatrix();
}
< /code>
У меня есть проблема, когда я пытаюсь написать свой текст в контейнере с активированным многослойным свойством. Код для записи многослойный текст: < /p>
private void DrawMultilineText(string text, float textWidth, SKFont font, SKRect container, float startX, OggettoLayout oggetto, SKCanvas canvas, SKPaint paint, float offsetY)
{
var lines = GetWordsForRow(text, textWidth, font, container).ToList();
if (lines.Count == 0)
return;
float y = GetOffsetY(lines.Count, offsetY, container, oggetto.StileTesto.AllineamentoVerticale, font);
float lineHeight = font.Metrics.Descent - font.Metrics.Ascent;
if (lineHeight
Но это не работает. Точнее, текст не появляется. В то время как, если я напишу метод 'DraitMultIlineText' как это: < /p>
private void DrawMultilineText(string text, float textWidth, SKFont font, SKRect container, float startX, OggettoLayout oggetto, SKCanvas canvas, SKPaint paint, float offsetY)
{
var lines = GetWordsForRow(text, textWidth, font, container).ToList();
if (lines.Count == 0)
return;
float y = GetOffsetY(lines.Count, offsetY, container, oggetto.StileTesto.AllineamentoVerticale, font);
float lineHeight = font.Metrics.Descent - font.Metrics.Ascent;
if (lineHeight
это работает.
Очевидно, я не могу использовать эту версию кода, потому что это только тест, в котором я точно знаю, сколько линий есть. Я должен использовать версию с циклом Foreach, но я не могу понять, почему он не работает.
Подробнее здесь: https://stackoverflow.com/questions/797 ... -skiasharp