ширина искровой этикетки - PullRequest
1 голос
/ 05 августа 2011

Мне нужно установить текст метки свечи, а затем расположить такую ​​метку вдоль оси x в зависимости от ее ширины. К сожалению, кажется, что ширина метки не обновляется сразу, и поэтому позиционирование не удастся. Я могу прослушивать события updateComplete на метке и обновлять ее положение, но это означает, что метка перемещается гораздо чаще, чем хотелось бы (updateComplete срабатывает гораздо чаще, чем при изменении ширины). Любые идеи о том, как правильно справиться с тем, что кажется тривиальной задачей?

Вот фрагмент кода, который показывает то, что я описал выше. Если вы нажмете кнопку, вы увидите 3 следа: ширину этикетки до изменения ее текста, сразу после установки ее текста и после завершения обновления самой этикетки. Хотелось бы узнать, есть ли способ получить правильную ширину без прослушивания событий updateComplete ... Кнопка и группы VG просто для запуска примера

<?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 ]

2 голосов
/ 10 февраля 2012

Следующее сработало для меня. Простой, но работает.

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 голос
/ 06 августа 2011

Если вы используете 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)принять текущее значение (т. е. они передаются по значению), тогда как переменные, на которые вы делаете прямую ссылку в функции, фактически находятся в области видимости при выполнении функции (т. е. замыкание ).

Вы можете сделать это и с прослушивателем событий, но с callLater () это немного проще.

1 голос
/ 05 августа 2011

VGroup - это Group с VerticalLayout.Не позволяет настраивать позиционирование внутри группы (с x и y).Чтобы иметь такую ​​возможность, используйте Group с (по умолчанию) BasicLayout.

0 голосов
/ 05 августа 2011

похоже, что прослушивание событий изменения размера делает свое дело и не так широко, как события updateComplete, поэтому я называю это «правильный ответ». Возможно, есть лучший способ сделать это, когда вы пытаетесь расположить вещи вручную из-за оптимизации производительности, хотя я пока не уверен, что это такое.

0 голосов
/ 05 августа 2011

Вы можете вызвать lb.validateNow () после установки текста, таким образом вы сразу получите новую ширину.Но предлагаю вам прочитать о жизненном цикле компонентов, чтобы не было таких тривиальных вопросов.

И да, как уже отмечали люди, никакое изменение положения не будет работать с таким расположением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...