2012-04-03 61 views
0

請明白:我在ActionScript中的總初學者以及任何與ActionScript一樣,雖然我通常有我在做什麼,作爲一個程序員的一些想法,我有自我學習這門語言和Flex Builder一些挫折。現在我試圖做一個非常簡單的實現,其中標籤有效地在程序運行的前幾秒內多次添加文本。我遇到的問題是,我不能只把所有的東西都放到一個函數中,而是在那個函數上調用一個函數,因爲只有在函數運行完整的過程之後,才能看到對標籤文本的更改。如何在ActionScript 3.0中更改畫布後運行函數?

所以我試圖用一個viewstack和克隆畫布幾次,給該標籤的每一個帆布的版本文本的不同位。然後,我爲viewstack設置初始化函數,以便在頭幾秒內定期更改畫布。但是這也不起作用,因爲直到函數運行完整的過程之後纔會看到區別。

於是我試圖把函數調用對個人畫布初始化屬性,並將這些功能都沒有被稱爲在所有明顯。

這是什麼?我知道這可能不是您應該在ActionScript或Flex中爲某些東西製作動畫的方式,但我仍然想知道如何通過這種方式來解決問題以供將來參考。我錯過了什麼?謝謝!

回答

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> 
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> 
相關問題