2010-05-26 52 views
21

我试图计算WIDE如何使我的按钮,基于它将包含的文本,以及当我尝试谷歌如何计算一些简单的东西作为宽度的一些TEXT,我睁大眼睛试图通过显然无意义的深奥的反直觉巫术进行交流。任何人都可以帮助我简化如何编写这样的功能:在ActionScript和Flex中计算文本宽度

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

在此先感谢。

+0

当你说按钮中的文本...你的意思是按钮的标签?或者一个文本框或一个文本框? – phwd 2010-05-26 21:35:52

回答

21

只要你在UIComponent的时候,你可以使用measureText功能。

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

话虽这么说,柔性按钮组件会自动大小的文本的宽度,如果不设置宽度就可以了。这样如果你需要文本宽度,你可以调用使用textWidth属性。

+2

我可能做错了,但我得到: TypeError:错误#2007:参数antiAliasType必须为非null。 – Joshua 2010-05-26 21:59:50

+0

你在设置antiAliasType吗? – quoo 2010-05-26 22:08:52

+0

什么是antiAliasType?那是什么?我在哪里设置它?它是lineMetrics的一部分吗?按钮??我如何找到它? – Joshua 2010-05-26 22:16:28

-1

听起来像是你可以使用textWidth

+0

这是如何考虑按钮标签的格式,字体,大小和其他属性的? – Joshua 2010-05-26 21:50:28

0

约书亚,它确实有助于清楚。你在说TextField,MX Label,Spark Label,RichText等吗?不同的文本组件使用不同的文本引擎,例如FTE和TLF,并且可能有不同的解决方案。我当然希望Adobe有一套很好的实用程序或示例代码,可以预测在实际执行操作之前呈现在控件上的字体大小。但是,好消息是,在某些情况下 - 比如一个老式的TextField,你可以预测得很好。您只需创建一个TextField,将其设置为textFormat字段,自动调整大小的方法和文本。您应该能够在将它添加到任何地方之前获得它的大小。我不记得命令是什么,但是,我记得你设置这些属性的顺序很重要。如果你不知道如何去做,我可以提供一个代码示例。现在,对于新的“改进”组件,比如Spark Labels - 如果我能找到一种该死的方式,我会被惹怒......在这上面花了好几个小时,还没有找到一个方法......或者某个人知道一种方式:P。

2

Here's你怎么做,在星火:

我修改 - 简单 - 他的榜样了一下这里:

var textMetrics:TextLineMetrics = label.measureText(label.text); 
var textWidth:int = textMetrics.width; 
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”宽...

+0

为什么需要排水沟? – davidkomer 2013-06-16 11:30:22

+0

这是来自Adobe的文档。 http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/text/TextLineMetrics.html Adob​​e在文本框周围增加了2个像素。 – Simmoniz 2013-06-18 18:47:33

0

quoo的回答跟进我评论,这里是为同一目的的代码,但仅仅霎那宽出TextField,用TextLineMetrics还有:

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

下面是工作也是一个办法:

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

我认为,textField.textWidth建设工程正常......直到你改变字体大小。 它似乎计算基于12px字体的宽度。 所以,如果你有嵌入字体和全球的造型,你可以尝试快速的解决方案:

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

我已经试过这对长期和短期的字符串,其结果是正确的。