在 ActionScript 和 Flex 中计算文本宽度

Posted

技术标签:

【中文标题】在 ActionScript 和 Flex 中计算文本宽度【英文标题】:Calculating Text Width In ActionScript And Flex 【发布时间】:2011-02-24 09:44:55 【问题描述】:

我正在尝试根据按钮将包含的文本来计算按钮的宽度,当我尝试在谷歌上搜索如何计算像某些文本的宽度这样简单的东西时,我睁大了眼睛只是试图通过显然是荒谬的深奥反直觉的巫毒教。任何人都可以帮助我简化我将如何编写这样的函数:

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

提前致谢。

【问题讨论】:

当您说按钮中的文本时......您是指按钮的标签吗?或文本字段或文本框? 【参考方案1】:

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

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

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

【讨论】:

我可能做错了什么,但我得到:TypeError: Error #2007: Parameter antiAliasType must be non-null. 你在设置antiAliasType吗? 你在哪一行?调试器应该告诉你它是什么属性——它可能是按钮标签的,但是如果没有看到代码就很难判断。它应该默认设置为“正常”。 我找到了对 antiAliasType 奇怪here 的解释:“如果您尝试使用 measureText() 方法,请注意您尝试测量的文本 (text:String) 必须是在尝试运行该方法之前添加到舞台(应用程序)的 UIComponent 中,否则您将收到以下极其神秘的错误:TypeError:错误#2007:参数 antiAliasType 必须为非空。” --- 归功于 Sunil_Bhaskaran 另外,如果要将其与TextField 一起使用,您可以删除text 并改用getLineMetrics,如adobe docs 上的一个示例所示。我将添加另一个答案来说明这一点。【参考方案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”宽...

【讨论】:

为什么需要排水沟? 这是来自 Adob​​e 文档。 help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/…Adobe 在文本字段周围添加 2 个像素。【参考方案3】:

Here's 在 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 Label、Spark Label、RichText 等吗?不同的文本组件使用不同的文本引擎,例如 FTE 和 TLF,并且可能有不同的解决方案。我当然希望 Adob​​e 有一套好的实用程序或示例代码,可以在您实际执行之前预测渲染到控件上的字体大小。但是,好消息是,在某些情况下——比如一个好的老式 TextField,你可以很好地预测到这一点。您只需创建一个 TextField,设置它的 textFormat 字段、自动调整大小方法和文本。在将其添加到任何地方之前,您应该能够获得它的大小。我不记得顺序是什么,但是,我记得你设置这些属性的顺序很重要。如果你不知道怎么做,我可以提供一个代码示例。现在,对于新的、“改进的”组件,例如 Spark 标签 - 如果我能找到该死的方法,我会被搞砸的……在这上面花了几个小时却没有找到方法……或者有人知道方法:P。

【讨论】:

【参考方案7】:

quoo 的回答中跟进我的评论,这是用于相同目的的代码,但只是从 TextField 中获取宽度,使用 TextLineMetrics还有:

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

【讨论】:

【参考方案8】:

听起来你可以使用textWidth

【讨论】:

这是如何兼顾按钮标签的格式、字体、大小等属性的?

以上是关于在 ActionScript 和 Flex 中计算文本宽度的主要内容,如果未能解决你的问题,请参考以下文章

flex:在桌面应用程序中的 ActionScript 和 JavaScript 之间进行通信

在 flex 中使用 Actionscript (MovieClip) 类

在用 Actionscript 和 MXML 编写的 Flex 程序中调试内存泄漏的最佳方法是啥?

如何以正确的方式在 Actionscript 3 / Flex 3 中嵌入图像?

在 Flex/Actionscript 中捕获视频缩略图

Flex 3 是不是支持线程?