Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   "Умное" обрезание длинного текста (http://www.flasher.ru/forum/showthread.php?t=197487)

elder_Nosferatu 08.04.2013 06:37

"Умное" обрезание длинного текста
 
Салют!

Хочу спросить совета у людей, которы на "ты" с ТекстФилдами.
У меня есть лейбл фиксированой ширины. Если текст в него не влазит, нужно выкинуть лишние символы справа и вставить вместо них троеточие.
Для нагладности вот вам ример: посмотрите на ту вкладку своего браузера где открыта эта страница. Скорее всего название страници "обрезано" и втиснуто в допустимую ширину.

Чтобы достчь такого результата я к исходной строке приконекчиваю троеточие (в самом начале) и постепенно отсекаю символы справа, пока ширина текста в текстфилде не будет хотя бы на 4 ченьше, чем ширина самого текстфилда. После этого я убираю тоеточие вначале стрки и пихаю эго в конец.
Алгоритм рабочий, но он мне не очень нравится, так как для каждого отсечения нужно дергать текстфилд. Может есть у кого нить грамотное решение?

caseyryan 08.04.2013 08:43

Оно?

Добавлено через 2 минуты
Хотя похоже не совсем то, но отрезать до определенной длины позволяет.
А дальше я бы просто зрительно посчитал сколько букв входит в видимую часть текстового поля (учитывая самые широкие буквы типа М и Ш), и урезал текст до этой длины, если textWidth больше ширины поля

Wolsh 08.04.2013 11:22

А по-моему вполне нормальный подход, ибо рассчитывать математикой тут не получится все-равно: буквы разной ширины.
Есть еще другие способы "обрезания" — VanishLabel например, когда строка в конце постепенно становится прозрачной, и его расширенные анимированные варианты, когда строка при наведении двигается в "окошке" лейбла, давая прочитать себя полностью — автоматически проматывается или в зависимости от положения курсора, как в фотогалерейных скроллерах.. Ну это слегка вычурно конечно, для некоторых сайтов подходит, а для GUI программного приложения слишком неожиданно))

gagaga 08.04.2013 11:56

можно пройтись по всем буквам/цифрам/символам циклом (для конкретного шрифта) и составить словарик ширин символов, потом считать математически

C4Grey 08.04.2013 12:10

Я делал так:
1. Знаем длину и позицию TextField-a, соответственно, знаем точку, где заканчивается текст.
2. Смещаем точку на величину, равную длине троеточия в данном формате текста(можно расчитать предварительно).
3. Обрезаем все после символа на полученной точке(FText.getCharIndexAtPoint), добавляем к тексту троеточие.
Алгоритм похож на приведенный в нулевом топике, но вдруг поможет :)

caseyryan 08.04.2013 12:18

Цитата:

Обрезаем все после символа на полученной точке(FText.getCharIndexAtPoint), добавляем к тексту троеточие.
По-моему это лучший вариант. Тут можно даже не считать ничего зрительно

strangedk 08.04.2013 14:02

Цитата:

Сообщение от gagaga (Сообщение 1128770)
можно пройтись по всем буквам/цифрам/символам циклом (для конкретного шрифта) и составить словарик ширин символов, потом считать математически

Ну очень сильно, по моему.
В большинстве случаев с запасом хватит просто знать количество символов, и может среднюю ширину символа.

olexandr 09.04.2013 01:28

мой вариант ресурсоемкий, но я его применял для небольшого текста.
сначала присваиваю полную строку, а потом через цикл while обрезаю по символу, пока textField не будет допустимых размеров.
после цикла, убираем еще 2 или 3 символа и добавляем 3 точки.

Nooob 09.04.2013 04:46

есть ещё getCharBoundaries(charIndex:int):Rectangle, но да getCharIndexAtPoint лучший вариант

etc 09.04.2013 12:14

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


Часовой пояс GMT +4, время: 01:43.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.