Расчет ширины текста в ActionScript и Flex - PullRequest
21 голосов
/ 27 мая 2010

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

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

Заранее спасибо.

Ответы [ 8 ]

21 голосов
/ 27 мая 2010

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

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

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

9 голосов
/ 06 мая 2011

Работает любой формат, размер, тип шрифта. Не забывайте свойства "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" ...

2 голосов
/ 12 августа 2010

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

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

var textMetrics:TextLineMetrics = label.measureText( label.text );  
var textWidth:int = textMetrics.width; 
1 голос
/ 11 марта 2013

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

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

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

1 голос
/ 19 декабря 2012

Вот способ, который также работает:

var tempText:Text = new Text();
tempText.regenerateStyleCache(false);
var textWidth:int = tempText.measureText(*yourstring*).width;
0 голосов
/ 18 июня 2011

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

    public function mtxtWidth(container:TextField):int {
       var lineMetrics:TextLineMetrics = container.getLineMetrics(0);
       return lineMetrics.width;      
    }
0 голосов
/ 28 мая 2010

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

0 голосов
/ 27 мая 2010

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

...