Apache flex 在ActionScript和Flex中计算文本宽度

Apache flex 在ActionScript和Flex中计算文本宽度,apache-flex,flash,actionscript-3,air,Apache Flex,Flash,Actionscript 3,Air,我试图根据按钮包含的文本计算按钮的宽度,当我试图在谷歌上搜索如何计算一些像文本宽度这样简单的东西时,我的眼睛交叉着,只是试图涉过看似荒谬、深奥、反直觉的巫术。有谁能帮我简化一下如何编写这样的函数: public function HowWideWouldThisTextBeIfItWereInThisButton(Text:String,Container:Button):int { ... } 提前感谢。听起来您可以使用只要您在UIComponent中,就可以使用该功能 public fu

我试图根据按钮包含的文本计算按钮的宽度,当我试图在谷歌上搜索如何计算一些像文本宽度这样简单的东西时,我的眼睛交叉着,只是试图涉过看似荒谬、深奥、反直觉的巫术。有谁能帮我简化一下如何编写这样的函数:

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

提前感谢。

听起来您可以使用

只要您在UIComponent中,就可以使用该功能

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

也就是说,如果没有设置宽度,flex按钮组件应该自动调整为文本的宽度。这样,如果您需要文本宽度,只需调用使用textWidth属性即可。

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

你在Spark中是如何做到的:

我对他的例子做了一些修改-简化-如下:

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

这适用于任何格式、大小、字体类型。别忘了属性“自动调整大小”和“文字包装”

您的按钮需要是“tf.width”宽…

根据我对quoo答案的评论,以下是用于相同目的的代码,但只需从
文本字段中抓取宽度,同时使用:


以下是一种同样有效的方法:

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

正如我所想,
textField.textWidth
构造工作得很好。。。直到你改变字体大小。 它似乎是基于12px字体计算宽度的。 因此,如果您有嵌入式字体和全局样式,您可以尝试快速解决方案:


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

当你说出按钮中的文本时。。。你是说按钮的标签吗?或者文本字段或文本框?这是如何考虑按钮标签的格式、字体、大小和其他属性的?我可能做错了什么,但我得到了:TypeError:Error#2007:参数antiAliasType必须为非null。是否设置antiAliasType?使用的行号是什么?调试器应该告诉您它是什么属性——很可能是按钮标签的属性,但是很难告诉w/o是否看到了代码。默认情况下,它应该设置为“正常”。我发现了反锯齿类型奇怪的解释:“如果您尝试使用measureText()方法,请预先警告您尝试测量的文本(文本:字符串)必须位于添加到STAGE(应用程序)的UIComponent中。”在您尝试运行该方法之前,否则您将得到一个极其神秘的错误:TypeError:error#2007:参数antialastype必须为非null。”---Sunil_Bhaskaranalso将其用于
文本字段
,您可以删除
文本
,改用
getLineMetrics
,就像上面的一个例子一样。我将添加另一个答案来说明这一点。为什么需要排水沟?这来自Adobe文档。Adobe在文本字段周围添加了2个像素。
    public function mtxtWidth(container:TextField):int {
       var lineMetrics:TextLineMetrics = container.getLineMetrics(0);
       return lineMetrics.width;      
    }
var tempText:Text = new Text();
tempText.regenerateStyleCache(false);
var textWidth:int = tempText.measureText(*yourstring*).width;
var realWidth = myLabel.textField.textWidth * (fontSize / 12);