Я работаю с библиотекой 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
DrawText внутри цикла Foreach с Skiasharp ⇐ C#
Место общения программистов C#
1756209979
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, но я не могу понять, почему он не работает.
Подробнее здесь: [url]https://stackoverflow.com/questions/79746722/drawtext-inside-a-foreach-cycle-with-skiasharp[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия