DrawText внутри цикла Foreach с SkiasharpC#

Место общения программистов C#
Ответить
Anonymous
 DrawText внутри цикла Foreach с Skiasharp

Сообщение Anonymous »

Я работаю с библиотекой 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»