Перейти к содержанию
Fire Monkey от А до Я
  • 0

Некорректный вывод текста под Андроид.


Вопрос

Добрый день!

Столкнулся с проблемой некорректного отображения текста под Андроид.

Длинный текст выводится через TLabel, перенос включен, обрезка по словам. Вот как это должно выглядеть: 

 

post-312-0-23395300-1437482702.png

 

А вот как это смотрится на экране телефона:

 

post-312-0-42436800-1437482714_thumb.png

 

Проявляется на  XE7 и XE8 триал. Может кто проверить на XE8 Update1?

Была ли у кого такая проблема и как удалось решить?

 

Спасибо!

 

В архиве демо-пример.

TextOutError.zip

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Модераторы

Косяк скорей всего в неправильно выбранной высоте контролов, попробуйте задать высоту на андроиде правильную в зависимости от размера шрифта

Ссылка на комментарий
  • 0
  • Администраторы
  1. Для Label1. Уберите WordWrap = False. Сейчас он True, поэтому на андроиде у вас идет перенос текста. Почему на винде все ок. не знаю. Нужно смотреть.
  2. На счет Label2 и артефактов снизу, пока не могу их получить, как у вас на скриншоте.
Ссылка на комментарий
  • 4

Итак, год спустя описываю решение проблемы.  Исследования проводил в Берлине, но думаю рецепт подойдет и для младших версий.

1. Ошибка существует в файле FMX.TextLayout.GPU, поэтому копируем его в проект.

2. Убираем мусор при отрисовке кропнутого символа.

Ищем в файле следующий фрагмент:
 

            ColoredGlyph := TFontGlyphStyle.ColorGlyph in Rec.Glyph.Style;
            if ColoredGlyph then
              TCustomCanvasGpu(ACanvas).ModulateColor := $FFFFFFFF;
            ACanvas.DrawBitmap(Rec.Bitmap, SrcR, R, Opacity);
            if ColoredGlyph then
              TCustomCanvasGpu(ACanvas).ModulateColor := LRun.Color;

и заменяем его на 

          if not R.IsEmpty then begin
            // Disable draw empty rect
            ColoredGlyph := TFontGlyphStyle.ColorGlyph in Rec.Glyph.Style;
            if ColoredGlyph then
              TCustomCanvasGpu(ACanvas).ModulateColor := $FFFFFFFF;
            ACanvas.DrawBitmap(Rec.Bitmap, SrcR, R, Opacity);
            if ColoredGlyph then
              TCustomCanvasGpu(ACanvas).ModulateColor := LRun.Color;
          end;

Пояснение: при расчете области отрисовки R символа, мы можем получить "отрицательный размер", где Bottom будет меньше чем Top. Соответсвенно такой же неправильной становиться область источника SrcR и на экран вылазит мусор.

3. От мусора избавились, но если присмотреться к нижней границе текста, то можно увидеть, что отрезка не ровная, одни символы отрезаны больше, другие меньше. Для этого нужно исправить алгоритм расчета области отсечения. 

Для этого ищем комментарий  //Checking for lines lower than bottom border - с него начинается ветка, в которую нужно внести изменения.

Чуть далее ищем код
 

                  Rec := AddOrGetChar(nil, Run.Chars[K], ChDic, Run.Font);
                  X := MaxSize.Y - FFrame.Last.TopLeft.Y - Rec.Glyph.VerticalAdvance * FScaleFactor;

и меняем его на 
 

                  Rec := AddOrGetChar(LayoutCanvas, Run.Chars[K], ChDic, Run.Font);
                  X := MaxSize.Y - FFrame.Last.TopLeft.Y - ((Rec.SrcRect.Height + Rec.Glyph.Origin.Y) * FScaleFactor);

Здесь пояснения дать сложнее, скажу только, что разработчики проигнорировали тот момент, что символы имеют разные размеры (например . и Ж) и считают отсечение не по размеру глифа символа а по экранному размеру символа, т.е. он будет одинаковый для всей строки, что неправильно, так как в дальнейшем данное отсечение применяется к глифу символа.

 

P.S. А куда переехал CodeCentral, не нашел его в Берлине? 

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...