Просмотр полной версии : "Умное" обрезание длинного текста
elder_Nosferatu
08.04.2013, 06:37
Салют!
Хочу спросить совета у людей, которы на "ты" с ТекстФилдами.
У меня есть лейбл фиксированой ширины. Если текст в него не влазит, нужно выкинуть лишние символы справа и вставить вместо них троеточие.
Для нагладности вот вам ример: посмотрите на ту вкладку своего браузера где открыта эта страница. Скорее всего название страници "обрезано" и втиснуто в допустимую ширину.
Чтобы достчь такого результата я к исходной строке приконекчиваю троеточие (в самом начале) и постепенно отсекаю символы справа, пока ширина текста в текстфилде не будет хотя бы на 4 ченьше, чем ширина самого текстфилда. После этого я убираю тоеточие вначале стрки и пихаю эго в конец.
Алгоритм рабочий, но он мне не очень нравится, так как для каждого отсечения нужно дергать текстфилд. Может есть у кого нить грамотное решение?
caseyryan
08.04.2013, 08:43
Оно? (http://icodesnip.com/snippet/actionscript-3/as3-trim-text-for-specific-width-and-heigh)
Добавлено через 2 минуты
Хотя похоже не совсем то, но отрезать до определенной длины позволяет.
А дальше я бы просто зрительно посчитал сколько букв входит в видимую часть текстового поля (учитывая самые широкие буквы типа М и Ш), и урезал текст до этой длины, если textWidth больше ширины поля
А по-моему вполне нормальный подход, ибо рассчитывать математикой тут не получится все-равно: буквы разной ширины.
Есть еще другие способы "обрезания" — VanishLabel например, когда строка в конце постепенно становится прозрачной, и его расширенные анимированные варианты, когда строка при наведении двигается в "окошке" лейбла, давая прочитать себя полностью — автоматически проматывается или в зависимости от положения курсора, как в фотогалерейных скроллерах.. Ну это слегка вычурно конечно, для некоторых сайтов подходит, а для GUI программного приложения слишком неожиданно))
можно пройтись по всем буквам/цифрам/символам циклом (для конкретного шрифта) и составить словарик ширин символов, потом считать математически
Я делал так:
1. Знаем длину и позицию TextField-a, соответственно, знаем точку, где заканчивается текст.
2. Смещаем точку на величину, равную длине троеточия в данном формате текста(можно расчитать предварительно).
3. Обрезаем все после символа на полученной точке(FText.getCharIndexAtPoint), добавляем к тексту троеточие.
Алгоритм похож на приведенный в нулевом топике, но вдруг поможет :)
caseyryan
08.04.2013, 12:18
Обрезаем все после символа на полученной точке(FText.getCharIndexAtPoint), добавляем к тексту троеточие.
По-моему это лучший вариант. Тут можно даже не считать ничего зрительно
strangedk
08.04.2013, 14:02
можно пройтись по всем буквам/цифрам/символам циклом (для конкретного шрифта) и составить словарик ширин символов, потом считать математически
Ну очень сильно, по моему.
В большинстве случаев с запасом хватит просто знать количество символов, и может среднюю ширину символа.
olexandr
09.04.2013, 01:28
мой вариант ресурсоемкий, но я его применял для небольшого текста.
сначала присваиваю полную строку, а потом через цикл while обрезаю по символу, пока textField не будет допустимых размеров.
после цикла, убираем еще 2 или 3 символа и добавляем 3 точки.
есть ещё getCharBoundaries(charIndex:int):Rectangle (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/text/TextField.html#getCharBoundaries()), но да getCharIndexAtPoint лучший вариант
Уменьшать межсимвольное расстояние до определенного момента, затем выполнять обрезку точечками.
Если это ярлыки (т.е. текста по определению не много, и его не нужно выделять / копирововть / редактировать), то можно было бы использовать TextLine / TextBlock - там программист сам ответственный за то, куда символы ставятся. Т.е. посчитать пространство / позицию любого символа будет тривиально.
Расстановка символов в TextField - не тривиальная, у шрифта могут быть заданы межбуквенные расстояния (таблицы кернинга), вообще процент добавленного расстояние может варьироваться еще и в зависимости от размера шрифта (при меньшем размере он может быть больше). Кроме того, границы курсивных букв могут не совпадать с тем, что сообщает getCharBoundaries.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.