火花标签的宽度

时间:2011-08-05 16:18:33

标签: flex

我需要设置一个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>

5 个答案:

答案 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)

VGroupGroupVerticalLayout。它不允许在组内进行自定义定位(使用xy)。要有这种可能性,请使用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(),这样您就可以立即获得新的宽度。但是建议你阅读有关组件生命周期的内容,不要有这些微不足道的问题。

是的,正如人们已经指出的那样,没有重新定位将适用于这种布局。