在ActionScript和Flex中计算文本宽度

21

我想根据按钮中包含的文本来计算它的宽度,但当我尝试在Google上搜索如何计算文字的宽度时,我感到非常困惑。请问有人能帮我简化一下编写这样一个函数的过程吗:

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

提前感谢。


当你说按钮中的文本时,你是指按钮的标签吗?还是一个文本字段或文本框? - phwd
8个回答

21

只要你在 UIComponent 中,你就可以使用 measureText 函数。

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

话虽如此,如果您没有在flex按钮组件上设置宽度,它应该会自动调整为文本的宽度。这样,如果您需要文本宽度,只需使用textWidth属性即可。


2
我可能做错了什么,但是我得到了以下错误: TypeError: Error #2007: 参数 antiAliasType 必须为非空。 - Joshua
你设置了 antiAliasType 吗? - quoo
1
你在哪一行代码处遇到了这个问题?调试器应该会告诉你它是哪个属性的问题——很可能是按钮标签的问题,但是没有看到代码很难确定。不过默认情况下它应该设置为“normal”。 - quoo
7
我在这里找到了一个关于antiAliasType奇怪性的解释链接:"如果你想使用measureText()方法,请注意你要测量的文本(text:String)必须在已经加入舞台(Application)的UIComponent中,然后才能运行该方法,否则你会收到极其难以理解的错误:TypeError:Error #2007:参数antiAliasType不能为空。" ——Sunil_Bhaskaran - Russ
1
此外,如果要与 TextField 一起使用,您可以删除 text 并改用 getLineMetrics,如 Adobe 文档中的一个示例所示。我将添加另一个答案来说明这一点。 - cregox
显示剩余3条评论

9

这适用于任何格式、大小和字体类型。不要忘记使用属性 "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”宽度...

为什么需要“gutters”? - davidkomer
这是来自Adobe文档的内容。http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/text/TextLineMetrics.html Adobe在文本字段周围添加了2个像素。 - Simmoniz

2
这是在Spark中计算属性(如位置和尺寸)的方法:点击这里
我稍微修改了他的示例,让它更简单易懂。
var textMetrics:TextLineMetrics = label.measureText( label.text );  
var textWidth:int = textMetrics.width; 

1

这里还有一种可行的方法:

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

1
据我所思,textField.textWidth 的构造方法很好用...直到你改变字体大小。 它似乎是基于12像素字体计算宽度的。 因此,如果你有嵌入字体和全局样式,可以尝试快速解决方案:
var realWidth = myLabel.textField.textWidth * (fontSize / 12);

我已经在长字符串和短字符串上尝试过了,结果是正确的。

0

quoo 的回答中跟进 我的评论,这里是同样目的的代码,但只是从 TextField 中获取宽度,并使用 TextLineMetrics

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

0

Joshua,清晰明确地表达真的很有帮助。你是在说TextField、MX Label、Spark Label、RichText等吗?不同的文本组件使用不同的文本引擎,如FTE和TLF可能有不同的解决方案。我当然希望Adobe有一套好的工具或示例代码,可以预测控件上呈现的字体大小,在实际操作前就可以得知。但是好消息是,在某些情况下 - 比如,一个老式的TextField,你可以相当准确地预测它。你只需要创建一个TextField,设置它的textFormat字段、auto size方法和文本。在添加到任何地方之前,您应该能够获得它的大小。我不记得顺序是什么了,但是我记得设置这些属性的顺序很重要。如果您无法弄清楚如何做到这一点,我可以提供一个代码示例。现在,对于像Spark Labels这样的新型“改进”组件 - 如果我找不到该死的方法......已经花了好几个小时了,还没有找到方法......或者知道方法的人 :P。


-1

这如何考虑按钮标签的格式、字体、大小和其他属性? - Joshua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接