0

请理解:我完全是 Actionscript 和 Actionscript 之类的初学者,虽然我通常对自己作为程序员的工作有所了解,但我在自学这门语言和 Flex Builder 方面遇到了一些挫折。现在我正在尝试做一个非常简单的实现,其中标签在程序运行的前几秒钟内有效地添加了多次其文本。我遇到的问题是,我不能将所有这些都放在一个函数中+对该函数的一次调用,因为在该函数运行完整过程之前,显然不会看到对标签文本的更改。

所以我尝试使用视图堆栈并克隆画布几次,为每个画布的标签版本提供不同的文本。然后我为视图堆栈设置了初始化函数,以在最初的几秒钟内定期更改画布。但这也不起作用,因为直到函数运行其全部过程才能看到差异。

因此,我尝试将函数调用放在各个画布的初始化属性上,而这些函数显然根本没有被调用。

有没有搞错?我知道这甚至可能不是您应该在 ActionScript 或 Flex 中制作动画的方式,但我仍然想知道如何以这种方式解决问题以供将来参考。我错过了什么?谢谢!

4

2 回答 2

2

正如您所注意到的,在执行您编写的函数的过程中不会发生对程序显示输出的更改。ActionScript 是单线程的,这意味着更新屏幕的任何框架代码都不能在您的函数运行时运行。

如果您有兴趣确切了解为了更新屏幕会发生什么,请搜索“flex 组件生命周期”并阅读您找到的一些内容。它有点高级,但它确实帮助我理解了 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>
于 2012-04-03T17:51:13.370 回答
1

一种基本方法是对标签值使用数据绑定,并使用 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>
于 2012-04-03T18:05:41.373 回答