|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Aug 2007
Сообщений: 168
|
TextField: Замен. последние видимые символы точками, если текст слишком длинный
Здравстуйте. Подскажите пожалуйста эффективный алгоритм преобразования строки текста так, чтобы если она полностью не помещаеться в однострочное текстовое поле, то ее последние видимые в поле символы заменялись точками, причем желательно чтобы результат не зависел ни от шрифта ни от размера строки. Мне пока пришла на ум такая реализация:
Но она ужасно неэффективна на мой взгляд, усовершенствать пока не смог, поэтому обращаюсь к вам. |
|
|||||
Modus ponens
|
Можно пробовать получить Rectangle знака и когда позиция знака окажется на видимой границе - отрезать, так хоть перерисовывать не нужно. Но можно попробовать добавить какую-нибудь более продвинутую логику, типа предположить, где примерно должен закончится текст и от туда искать (например, предположить что буквы занимают в ширину 80% от их высоты, ну и соответсвенно посчитать на каком примерно знаке закончится строка.
__________________
Hell is the possibility of sanity |
|
|||||
com.inreflected.utils::TextFieldUtils
/** * @private * The padding to be added to textWidth to get the width * of a TextField that can display the text without clipping. * * from Adobe Flex SDK */ private static const TEXT_WIDTH_PADDING:int = 5; /* * @author Pavel fljot */ public static function truncateToFit(textField:TextField, maxWidth:Number = NaN, truncationIndicator:String = "..."):Boolean { var truncated:Boolean = false; var originalText:String = textField.text; var originalWidth:Number = textField.width; if (isNaN(maxWidth)) { maxWidth = originalWidth; } // Need to check if we should truncate, but it // could be due to rounding error. Let's check that it's not. // Examples of rounding errors happen with "South Africa" and "Game" // with verdana.ttf. // from Adobe Flex SDK if (originalText != "" && textField.textWidth + TEXT_WIDTH_PADDING > maxWidth + 0.00000000000001) { var originalTextWidth:Number = textField.textWidth; textField.appendText(truncationIndicator); var concatWidth:Number = textField.textWidth - originalTextWidth; var activeWidth:Number = maxWidth - concatWidth; var s:String = originalText; while (s.length > 1 && textField.textWidth + TEXT_WIDTH_PADDING > activeWidth) { s = s.slice(0, -1); textField.text = s; } // Do not truncate so it will end on space while (s.length > 1 && s.charAt(s.length - 1) == " ") { s = s.slice(0, -1); } textField.text = s + truncationIndicator; truncated = true; } return truncated; } |
|
|||||
Регистрация: Aug 2007
Сообщений: 168
|
Всем большое спасибо!
|
|
|||||
Регистрация: Oct 2009
Адрес: Калининград
Сообщений: 134
|
Можно использовать mx:Label вместо текстфилда, там точки автоматически встают и не надо ничего изобретать =)
__________________
Жду ответа, как соловей лета. (С) Морис Мосс, 'IT Crowd' |
Часовой пояс GMT +4, время: 19:02. |
|
« Предыдущая тема | Следующая тема » |
|
|