AS3 TextLineMetrics получить ширину текста ДО ТОГО, как объект находится в списке отображения - PullRequest
2 голосов
/ 24 января 2012

У меня есть библиотека MovieClip Class, которая состоит исключительно из динамического текстового поля, содержащегося в MovieClip.

Я хочу создать экземпляр этого MC, заполнить textField текстом, получить ширину полученного текста и, еслиширина меньше предварительно определенного значения MIN_WIDTH, добавьте больше текста.

Если ширина равна или превышает мое значение MIN_WIDTH, добавьте этот класс MovieClip в список отображения.

Мой вопросКто-нибудь знает, возможно ли получить длину текста в textField с использованием Textlinemetrics ДО ТОГО, как textField будет добавлен в список отображения?

Ответы [ 2 ]

2 голосов
/ 05 марта 2012

Вам не хватает следующей информации, потому что измерения текста работают нормально при создании и настройке текстового поля, даже не добавляя его в список отображения.

Хитрость заключается в том, чтобы убедиться, что вы установилисвойство text для LAST, после полной настройки TextField .Установка свойства «текст», кажется, завершает макет, учитывая все ранее настроенные параметры.

Проблема, с которой вы сталкиваетесь, вероятно, заключается в том, что вы устанавливаете свойство «текст», а затем вносите изменения в другие параметры.такие как multiline или embedFonts.Когда вы это сделаете, getLineMetrics не будет возвращать правильные значения.Если затем установить свойство «текст» и снова проверить getLineMetrics, значения будут правильными.См. Этот пример и комментарии после операторов трассировки.

var tf:TextField = new TextField();
tf.defaultTextFormat = new TextFormat( "Arial Black", 16, 0, false );
tf.embedFonts = true;
tf.text = "Hello"; //set text last
trace( tf.getLineMetrics(0).height ); //Traces 22.55 (correct)

var tf2:TextField = new TextField();
tf2.defaultTextFormat = new TextFormat( "Arial Black", 16, 0, false );
tf2.text = "Hello"; //set text first
tf2.embedFonts = true; //modify a property after setting text seems to make the TextField "dirty"
trace( tf2.getLineMetrics(0).height ); //Traces 1.15 (incorrect)

var tf3:TextField = new TextField();
tf3.defaultTextFormat = new TextFormat( "Arial Black", 16, 0, false );
tf3.text = "Hello";
tf3.embedFonts = true; //modifying a property after setting the text seems to make the TextField "dirty"
tf3.text = "Hello"; //setting the text again seems to fix the problem
trace( tf3.getLineMetrics(0).height ); //Traces 22.15 (correct)

Урок здесь заключается в том, что порядок настройки TextField имеет значение.Это задокументировано как истинное, например, со свойством defaultTextFormat, которое необходимо установить ПЕРЕД настройкой текста, иначе заданный вами новый текст не поднимет defaultTextFormat.В этом случае текст может вообще не отображаться, если у вас включен embedFonts, и он использует другой шрифт по умолчанию, который не встроен.Поэтому убедитесь, что вы сначала установили defaultTextFormat, настроили другие свойства и задали «текст» последним, непосредственно перед вызовом getLineMetrics.

Здесь используйте эту функцию, которую я создал.Это заставляет вас сначала сконфигурировать важные свойства TextField (текст, тип, многострочный, выбираемый, embedFonts), а затем более поздние параметры в точности соответствуют конструктору TextFormat в том же порядке.Это гарантирует, что ваши свойства установлены в правильном порядке, текст назначается последним, и это уменьшит ваше создание TextField до одного оператора:

public static function CreateTextField( text:String = "", type:String = null, multiline:Boolean = false, selectable:Boolean = true, embedFonts:Boolean = false, font:String=null, size:Object=null, color:Object=null, bold:Object=null, italic:Object=null, underline:Object=null, url:String=null, target:String=null, align:String=null, leftMargin:Object=null, rightMargin:Object=null, indent:Object=null, leading:Object=null ):TextField
{
    var tf:TextField = new TextField();
    tf.defaultTextFormat = new TextFormat( font, size, color, bold, italic, underline, url, target, align, leftMargin, rightMargin, indent, leading );
    tf.embedFonts = embedFonts;
    tf.multiline = multiline;
    tf.selectable = selectable;
    tf.type = type;
    tf.text = text; //setting text last ensures the text line metrics returns correct values
    return tf;
}
0 голосов
/ 25 января 2012

Конечно - насколько я знаю, TextLineMetrics работает независимо от того, находится ли текстовое поле в списке отображения.Вы пробовали это и испытывали затруднения, заставляя это работать?Если это так, пожалуйста, дайте нам знать ваш код - если я что-то упустил, он должен просто работать.

...