Как запустить функцию после изменения холста в ActionScript 3.0?

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

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

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

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

2 ответа

Решение

Как вы заметили, изменения в отображаемом выводе вашей программы не могут произойти в середине выполнения функции, которую вы написали. 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>

Основной подход заключается в использовании привязки данных для значения метки и 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>
Другие вопросы по тегам