我需要设置一个spark标签的文本,然后根据x的宽度将这个标签沿x轴定位。不幸的是,似乎标签的宽度不会立即更新,因此定位将失败。我可以在标签上监听updateComplete事件并更新其位置,但这意味着比我想要的更频繁地重新定位标签(updateComplete比更改宽度时更频繁地触发)。关于如何正确处理看似简单的任务的任何想法?
这是一段代码片段,展示了我上面所描述的内容。如果按下按钮,您将看到3条曲线:更改文本前的标签宽度,设置文本后的标签宽度以及标签更新后的标签宽度。很想知道是否有办法获得正确的宽度而不必监听updateComplete事件...按钮和VGroups只是运行示例
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
<fx:Script>
<![CDATA[
import mx.events.FlexEvent;
protected function button1_clickHandler(event:MouseEvent):void
{
trace("label width = ", lb.width);
lb.addEventListener(FlexEvent.UPDATE_COMPLETE, lb_updateCompleteHandler);
lb.text = "hello world!";
trace("label width post change= ", lb.width);
}
protected function lb_updateCompleteHandler(event:FlexEvent):void
{
lb.removeEventListener(FlexEvent.UPDATE_COMPLETE, lb_updateCompleteHandler);
trace("label width post update complete = ", lb.width);
}
]]>
</fx:Script>
<s:VGroup>
<s:Button label="go" click="button1_clickHandler(event)"/>
<s:Label id="lb" text="h" x="10" y="10" />
</s:VGroup>
</s:Application>
答案 0 :(得分:2)
以下对我有用。简单而有效。
var l:Label = new Label();
l.text = "That'll do";
var tlm:TextLineMetrics = l.measureText( l.text);
Alert.show( tlm.width + " is what you are looking for");
答案 1 :(得分:1)
VGroup
是Group
,VerticalLayout
。它不允许在组内进行自定义定位(使用x
和y
)。要有这种可能性,请使用Group
和(默认)BasicLayout
。
答案 2 :(得分:1)
如果您使用callLater(),则可以“捕获”当前作用域中的变量,但也可以在width
的变化传播后执行。例如:
callLater(function():void
{
trace("label width in callLater = ", lb.width);
});
更新:我想我应该详细说明一下,通过“捕捉”价值来明确我的意思。这可以通过以下简单说明来完成:
callLater(function(prevWidth:Number):void
{
trace("previous label width in callLater = ", prevWidth); // 8
trace("label width in callLater = ", lb.width); // 64
}, [lb.width]);
如示例所示,您通过args
数组传入的参数(即[lb.width]
变为prevWidth
)获取当前值(即,它们通过但是,你在函数中直接引用的变量实际上在函数执行时的范围内(即,closure)。
您也可以使用事件监听器执行此操作,但使用callLater()可以更简单一些。
答案 3 :(得分:0)
看起来像监听调整大小事件一样,并且不像updateComplete事件那么通用,所以我称之为“正确答案”。当你试图通过性能优化手动定位东西时,可能有更好的方法,虽然我不确定它是什么。
答案 4 :(得分:-1)
您可以在设置文本后调用lb.validateNow(),这样您就可以立即获得新的宽度。但是建议你阅读有关组件生命周期的内容,不要有这些微不足道的问题。
是的,正如人们已经指出的那样,没有重新定位将适用于这种布局。