Кривяков Виталий Опубликовано 21 июля, 2015 Поделиться Опубликовано 21 июля, 2015 Добрый день! Столкнулся с проблемой некорректного отображения текста под Андроид. Длинный текст выводится через TLabel, перенос включен, обрезка по словам. Вот как это должно выглядеть: А вот как это смотрится на экране телефона: Проявляется на XE7 и XE8 триал. Может кто проверить на XE8 Update1? Была ли у кого такая проблема и как удалось решить? Спасибо! В архиве демо-пример. TextOutError.zip Цитата Ссылка на комментарий
0 #WAMACO Опубликовано 21 июля, 2015 Поделиться Опубликовано 21 июля, 2015 (изменено) подтверждаю, такой же косяк на XE8 update 1 проверял на Samsung Galaxy Note 3 Изменено 21 июля, 2015 пользователем wamaco Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 22 июля, 2015 Модераторы Поделиться Опубликовано 22 июля, 2015 Косяк скорей всего в неправильно выбранной высоте контролов, попробуйте задать высоту на андроиде правильную в зависимости от размера шрифта Цитата Ссылка на комментарий
0 VladimirS Опубликовано 22 июля, 2015 Поделиться Опубликовано 22 июля, 2015 А что, если высота контрола кратна размеру шрифта, то корректно заканчивает вывод "..."? Цитата Ссылка на комментарий
0 Кривяков Виталий Опубликовано 23 июля, 2015 Автор Поделиться Опубликовано 23 июля, 2015 Есть ли способ обойти данный глюк? Цитата Ссылка на комментарий
0 Администраторы Brovin Yaroslav Опубликовано 23 июля, 2015 Администраторы Поделиться Опубликовано 23 июля, 2015 Для Label1. Уберите WordWrap = False. Сейчас он True, поэтому на андроиде у вас идет перенос текста. Почему на винде все ок. не знаю. Нужно смотреть. На счет Label2 и артефактов снизу, пока не могу их получить, как у вас на скриншоте. Цитата Ссылка на комментарий
4 Кривяков Виталий Опубликовано 21 июля, 2016 Автор Поделиться Опубликовано 21 июля, 2016 Итак, год спустя описываю решение проблемы. Исследования проводил в Берлине, но думаю рецепт подойдет и для младших версий. 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, не нашел его в Берлине? Rusland, Равиль Зарипов (ZuBy), rareMax и 5 других 8 Цитата Ссылка на комментарий
0 Rusland Опубликовано 22 июля, 2016 Поделиться Опубликовано 22 июля, 2016 Кривяков Виталий, проверил у себя - все работает, мусора нет, спасибо! Еще бы понять почему многоточий в конце нет как в Windows Цитата Ссылка на комментарий
Вопрос
Кривяков Виталий
Добрый день!
Столкнулся с проблемой некорректного отображения текста под Андроид.
Длинный текст выводится через TLabel, перенос включен, обрезка по словам. Вот как это должно выглядеть:
А вот как это смотрится на экране телефона:
Проявляется на XE7 и XE8 триал. Может кто проверить на XE8 Update1?
Была ли у кого такая проблема и как удалось решить?
Спасибо!
В архиве демо-пример.
TextOutError.zip
Ссылка на комментарий
7 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.