Как запустить функцию после изменения холста в ActionScript 3.0? - PullRequest
0 голосов
/ 03 апреля 2012

Пожалуйста, поймите: я абсолютный новичок в Actionscript и в чем-то похожем на Actionscript, и хотя у меня, как правило, есть представление о том, что я делаю как программист, у меня есть некоторые недостатки в самостоятельном изучении этого языка и Flex Builder.,Прямо сейчас я пытаюсь сделать очень простую реализацию, в которой текст метки эффективно добавляется несколько раз в течение первых нескольких секунд запуска программы.Проблема, с которой я сталкиваюсь, заключается в том, что я не могу просто поместить все это в одну функцию + один вызов этой функции, поскольку изменения в тексте метки, по-видимому, не видны, пока эта функция не выполнит свой полный ход.

Поэтому я несколько раз пытался использовать видовой стек и клонировать холст, давая каждой версии метки этого холста различный текст.Затем я установил функцию инициализации для стека просмотра, чтобы изменять холсты на регулярной основе в течение первых нескольких секунд.Но это тоже не сработало, так как разница не видна до тех пор, пока функция не запустится полностью.

Итак, я попытался вызвать вызовы функций для атрибутов инициализации отдельных полотен, а эти функции непо-видимому, вообще.

Какого черта?Я знаю, что это, вероятно, даже не тот способ, которым вы должны анимировать что-то в ActionScript или Flex, но я все же хотел бы знать, как подходить к проблеме таким образом для дальнейшего использования.Что мне не хватает?Спасибо!

Ответы [ 2 ]

2 голосов
/ 03 апреля 2012

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

Если вам интересно узнать, что именно происходит для обновления экрана, выполнитепоиск по «гибкому компоненту жизненного цикла» и прочитайте некоторые вещи, которые вы найдете.Это немного продвинуто, но это было то, что действительно помогло мне понять, как работает фреймворк Flex.

В любом случае, на ваш реальный вопрос - как что-то оживить.Есть много способов, но для вашего случая постепенного добавления текста к метке, я бы, вероятно, использовал класс Timer.

Вот пример:

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

      private var timer:Timer;
      private var words:Array = ["The", "quick", "brown", "fox"];

      private function startTimer(event:FlexEvent):void
      {
        timer = new Timer(1000, 1);
        timer.addEventListener(TimerEvent.TIMER, updateText);
        timer.start();
      }

      private privatefunction updateText(event:TimerEvent):void
      {
        theLabel.text += words.shift() + " ";

        if (words.length > 0)
        {
          timer.reset();
          timer.start();
        }
      }
    ]]>
  </fx:Script>

  <s:Label id="theLabel" text="" creationComplete="startTimer(event)"/>

</s:Application>
1 голос
/ 03 апреля 2012

Основной подход заключается в использовании привязки данных для значения метки и setTimeout () или setInterval (), чтобы вызвать задержку между обновлениями.

Вот пример:

<?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" 
               initialize="init()"
               minWidth="955" minHeight="600">
    <fx:Script>
        <![CDATA[
            [Bindable]
            private var displayString:String = "Detonation in ";
            private var count:int = 5;
            private var timer:uint;

            private function init():void {
                timer = setInterval(updateDisplay, 1000);
            }

            private function updateDisplay():void {
                displayString += count + ".. ";
                if (--count == 0) {
                    clearInterval(timer);
                }
            }
        ]]>
    </fx:Script>
    <s:Label text="{displayString}"/>
</s:Application>
...