Apache flex 火花标签宽度
我需要设置spark标签的文本,然后根据其宽度沿x轴放置此类标签。不幸的是,标签的宽度似乎没有立即更新,因此定位将失败。我可以监听标签上的updateComplete事件,然后更新其位置,但这意味着重新定位标签的频率要比我希望的高很多(updateComplete触发频率要比更改宽度时高很多)。关于如何正确处理看似微不足道的任务,有什么想法吗 下面是一个代码片段,它显示了我上面描述的内容。如果按下该按钮,您将看到3条痕迹:更改文本前的标签宽度,设置文本后的标签宽度,以及完成标签自身更新后的标签宽度。想知道是否有一种方法可以在不必收听updateComplete事件的情况下获得正确的宽度。。。按钮和VGroups就在那里运行示例Apache flex 火花标签宽度,apache-flex,Apache Flex,我需要设置spark标签的文本,然后根据其宽度沿x轴放置此类标签。不幸的是,标签的宽度似乎没有立即更新,因此定位将失败。我可以监听标签上的updateComplete事件,然后更新其位置,但这意味着重新定位标签的频率要比我希望的高很多(updateComplete触发频率要比更改宽度时高很多)。关于如何正确处理看似微不足道的任务,有什么想法吗 下面是一个代码片段,它显示了我上面描述的内容。如果按下该按钮,您将看到3条痕迹:更改文本前的标签宽度,设置文本后的标签宽度,以及完成标签自身更新后的标签宽
<?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>
VGroup
是一个带有垂直布局的组。它不允许在组内进行自定义定位(使用x
和y
)。要实现这种可能性,请将Group
与(默认值)BasicLayout
一起使用,您可以在设置文本后调用lb.validateNow(),这样您将立即获得新的宽度。但建议您阅读有关组件生命周期的内容,不要有这样琐碎的问题
是的,正如人们已经指出的那样,在这样的布局中,没有任何重新定位会起作用。看起来,倾听调整大小的事件会起作用,并且不像updateComplete事件那样普遍,所以我称之为“正确答案”。由于性能优化,当您试图手动定位资料时,可能有更好的方法可以做到这一点,尽管我还不确定它是什么。如果使用,您可以“捕获”当前范围内的变量,但也可以在传播宽度的更改后执行它。例如:
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
数组传入的参数(即变为prevWidth
的[lb.width]
)采用当前值(即,它们按值传递),而,在函数中直接引用的变量实际上在函数执行时的作用域中(即a)
您也可以使用事件侦听器来执行此操作,但使用callLater()则更简单。以下内容对我很有用。简单但有效
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");
我不明白你想要的布局,你能试着用不同的词解释一下你想要的东西是如何出现的,以及它们实际上是如何出现的吗?我希望标签有一个x位置,这取决于它的宽度。这有点笼统,但我希望没那么难想象……你到底想实现什么?我的意思是:最终结果应该是什么样的?也许你可以发布一个截图。我有一种感觉,你试图用艰难的方式做一些事情,但我不知道。我认为你是对的,我试图用艰难的方式做一些事情,我偶然发现了一个关于标签的有趣的一般性问题。最终目标:我有一个标签,需要在一堆其他东西的左边。标签可以改变长度,材料可以增长或收缩。我想HGroup会帮我处理业务,但我当时试图远离自动化布局(我正在优化一些项目渲染器),并认为我可以自己定位标签(毕竟应该没那么难)。谢谢你的帮助!如果您正在谈论项目渲染器的优化,您最好使用mx.core.uiftextfield
或mx.core.UITextField
编写您自己的基于ActionScript的项目渲染器,其中位于updateDisplayList()
中。抱歉-VGroup与此问题无关,这只是一种独立定位按钮和标签的方法。will编辑问题-我显然写得不好:-)我尝试了validateNow,但令人惊讶的是,在这种情况下似乎没有做到这一点-不知道为什么。正如我在重新编辑中提到的,布局与问题无关。。。