Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 07.10.2010, 21:24
AlliAS вне форума Посмотреть профиль Отправить личное сообщение для AlliAS Найти все сообщения от AlliAS
  № 1  
Ответить с цитированием
AlliAS
 
Аватар для AlliAS

Регистрация: Aug 2007
Сообщений: 168
По умолчанию TextField: Замен. последние видимые символы точками, если текст слишком длинный

Здравстуйте. Подскажите пожалуйста эффективный алгоритм преобразования строки текста так, чтобы если она полностью не помещаеться в однострочное текстовое поле, то ее последние видимые в поле символы заменялись точками, причем желательно чтобы результат не зависел ни от шрифта ни от размера строки. Мне пока пришла на ум такая реализация:
Код AS3:
public function zipText(tf:TextField, text:String):String {
			var i:int = 0;
			tf.text = text;
			var str:String = tf.text;
			while(tf.textWidth > tf.width - 2){
				str = str.substr(0, str.length - 1);
				tf.text = str+"...";
				i++;
			}
			return tf.text;
		}
Но она ужасно неэффективна на мой взгляд, усовершенствать пока не смог, поэтому обращаюсь к вам.

Старый 07.10.2010, 21:50
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 2  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Можно пробовать получить Rectangle знака и когда позиция знака окажется на видимой границе - отрезать, так хоть перерисовывать не нужно. Но можно попробовать добавить какую-нибудь более продвинутую логику, типа предположить, где примерно должен закончится текст и от туда искать (например, предположить что буквы занимают в ширину 80% от их высоты, ну и соответсвенно посчитать на каком примерно знаке закончится строка.
__________________
Hell is the possibility of sanity

Старый 07.10.2010, 23:07
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 3  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
Сейчас модно чтобы последние 3-4 символа плавно переходили в прозрачность, такой fade.

Старый 08.10.2010, 01:50
fljot вне форума Посмотреть профиль Отправить личное сообщение для fljot Найти все сообщения от fljot
  № 4  
Ответить с цитированием
fljot

блогер
Регистрация: Jul 2007
Сообщений: 940
Записей в блоге: 3
com.inreflected.utils::TextFieldUtils
Код AS3:
/**
	     *  @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;
}
А проблемы с быстродействием решайте по мере их поступления

Старый 08.10.2010, 17:27
AlliAS вне форума Посмотреть профиль Отправить личное сообщение для AlliAS Найти все сообщения от AlliAS
  № 5  
Ответить с цитированием
AlliAS
 
Аватар для AlliAS

Регистрация: Aug 2007
Сообщений: 168
Всем большое спасибо!

Старый 08.10.2010, 18:59
Himerets вне форума Посмотреть профиль Отправить личное сообщение для Himerets Найти все сообщения от Himerets
  № 6  
Ответить с цитированием
Himerets
 
Аватар для Himerets

Регистрация: Oct 2009
Адрес: Калининград
Сообщений: 134
Можно использовать mx:Label вместо текстфилда, там точки автоматически встают и не надо ничего изобретать =)
__________________
Жду ответа, как соловей лета. (С) Морис Мосс, 'IT Crowd'

Создать новую тему Ответ Часовой пояс GMT +4, время: 19:02.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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