Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   TextField: Замен. последние видимые символы точками, если текст слишком длинный (http://www.flasher.ru/forum/showthread.php?t=145446)

AlliAS 07.10.2010 21:24

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;
                }

Но она ужасно неэффективна на мой взгляд, усовершенствать пока не смог, поэтому обращаюсь к вам.

wvxvw 07.10.2010 21:50

Можно пробовать получить Rectangle знака и когда позиция знака окажется на видимой границе - отрезать, так хоть перерисовывать не нужно. Но можно попробовать добавить какую-нибудь более продвинутую логику, типа предположить, где примерно должен закончится текст и от туда искать (например, предположить что буквы занимают в ширину 80% от их высоты, ну и соответсвенно посчитать на каком примерно знаке закончится строка.

Astraport 07.10.2010 23:07

Сейчас модно чтобы последние 3-4 символа плавно переходили в прозрачность, такой fade.

fljot 08.10.2010 01:50

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;
}

А проблемы с быстродействием решайте по мере их поступления

AlliAS 08.10.2010 17:27

Всем большое спасибо!

Himerets 08.10.2010 18:59

Можно использовать mx:Label вместо текстфилда, там точки автоматически встают и не надо ничего изобретать =)


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

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