Подтвердить что ты не робот

Вычисление ширины текста в ActionScript и Flex

Я пытаюсь вычислить, как WIDE делает мою кнопку, основываясь на тексте, который она будет содержать, и когда я пытаюсь понять, как вычислить что-то упрощенное, как ШИРИНА НЕКОТОРНОГО ТЕКСТА, я перехожу с косой просто пытаясь пробраться через явно бессмысленный эзотерический контр-интуитивный вуду. Может ли кто-нибудь помочь мне упростить, как бы я написал такую ​​функцию:

public function HowWideWouldThisTextBeIfItWereInThisButton(Text:String,Container:Button):int {
 ...
}

Спасибо заранее.

4b9b3361

Ответ 1

Пока вы используете UIComponent, вы можете использовать функцию measureText.

public function howWideWouldThisTextBeIfItWereInThisButton(text:String,container:Button):int {
   var lineMetrics:TextLineMetrics = container.measureText(text);
   return lineMetrics.width;      
}

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

Ответ 2

Это работает в любом формате, размере, типе шрифта. Не забывайте о свойствах "autoSize" и "wordWrap"!

var tf:TextField = new TextField();
addChild(tf);
tf.autoSize = TextFieldAutoSize.LEFT;
tf.wordWrap = false;
tf.text = "Whatever here";
tf.width = tf.textWidth + 4; // add 2 pixels-gutters left & right

Ваша кнопка должна быть шириной "tf.width"...

Ответ 3

Вот как вы это делаете в Spark:

Я изменил - упростил - его пример немного здесь:

var textMetrics:TextLineMetrics = label.measureText( label.text );  
var textWidth:int = textMetrics.width; 

Ответ 4

Здесь также работает способ:

var tempText:Text = new Text();
tempText.regenerateStyleCache(false);
var textWidth:int = tempText.measureText(*yourstring*).width;

Ответ 5

как мне кажется, textField.textWidth работает отлично... пока вы не измените размер шрифта. Кажется, он вычисляет ширину на основе шрифта 12px. Итак, если у вас есть встроенный шрифт и глобальный стиль, вы можете попробовать быстрое решение:

var realWidth = myLabel.textField.textWidth * (fontSize / 12);

Я пробовал это по длинным и коротким строкам, и результат правильный.

Ответ 6

Джошуа, это действительно помогает быть ясным. Вы говорите TextField, метку MX, ярлык Spark, RichText и т.д.? Различные текстовые компоненты используют разные текстовые движки, такие как FTE и TLF, и могут иметь разные решения. Я, конечно же, хотел бы, чтобы у Adobe был хороший набор утилит или пример кода, который мог бы предсказать, какой размер шрифта будет отображаться на элементах управления, прежде чем вы это сделаете. Но хорошей новостью является то, что в некоторых случаях, например, в старом стиле TextField, вы можете предсказать это довольно хорошо. Вы просто создаете TextField, задаете его поле textFormat, метод автоматического размера и текст. Вы должны иметь возможность получить его размер, прежде чем добавлять его в любом месте. Я не помню, что это за заказ, но я помню тот порядок, который вы задали для этих свойств. Если вы не можете понять, как это сделать, я могу привести пример кода. Теперь, для новых, "улучшенных" компонентов, таких как яркие ярлыки - я буду подслушивать, если я смогу найти чертовски способ... потратил на это несколько часов и не нашел способ... или кто-то, кто знает способ: P.

Ответ 7

После моего комментария на quoo ответе, здесь код для этой же цели, но просто хватайте ширину из TextField, используя TextLineMetrics:

    public function mtxtWidth(container:TextField):int {
       var lineMetrics:TextLineMetrics = container.getLineMetrics(0);
       return lineMetrics.width;      
    }

Ответ 8

Похоже, вы могли бы использовать textWidth