2012-04-03 4 views
0

Bitte verstehen Sie: Ich bin ein totaler Anfänger bei Actionscript und alles wie Actionscript, und obwohl ich im Allgemeinen eine Ahnung davon habe, was ich als Programmierer mache, habe ich einige Rückschläge beim Selbstlernen dieser Sprache und Flex Builder. Im Moment versuche ich eine sehr einfache Implementierung zu machen, bei der der Text eines Labels in den ersten paar Sekunden, in denen das Programm ausgeführt wird, mehrmals hinzugefügt wird. Das Problem, auf das ich stoße, ist, dass ich nicht alles in eine Funktion + einen Aufruf für diese Funktion setzen kann, da Änderungen am Etikettentext scheinbar erst dann zu sehen sind, wenn diese Funktion ihren vollen Lauf nimmt.Wie führe ich eine Funktion aus, nachdem die Zeichenfläche in ActionScript 3.0 geändert wurde?

Also habe ich versucht, einen Viewstack zu verwenden und die Leinwand ein paar Mal zu klonen, wobei ich jeder Canvas-Version dieses Labels ein anderes Stück Text gebe. Dann setze ich die Initialisierungsfunktion für den Viewstack, um die Leinwände in regelmäßigen Abständen während der ersten Sekunden zu wechseln. Das hat aber auch nicht funktioniert, da der Unterschied erst sichtbar wird, wenn die Funktion ihren vollen Lauf genommen hat.

Also habe ich versucht, Funktionsaufrufe auf die einzelnen Leinwände zu initialisieren Attribute, und diese Funktionen werden scheinbar überhaupt nicht aufgerufen.

Was zum Teufel? Ich weiß, dass dies wahrscheinlich nicht die Art und Weise ist, wie Sie etwas in ActionScript oder Flex animieren sollen, aber ich würde trotzdem gerne wissen, wie Sie das Problem auf diese Weise angehen können. Was vermisse ich? Vielen Dank!

Antwort

2

Wie Sie bemerkt haben, können Änderungen an der angezeigten Ausgabe Ihres Programms nicht während der Ausführung einer Funktion, die Sie geschrieben haben, geschehen. ActionScript ist single-threaded, was bedeutet, dass keiner der Framework-Code, der den Bildschirm aktualisiert, ausgeführt werden kann, während Ihre Funktion ausgeführt wird.

Wenn Sie genau wissen wollen, was passiert, um den Bildschirm zu aktualisieren, suchen Sie nach "flex component lifecycle" und lesen Sie etwas von dem, was Sie finden. Es ist ein bisschen fortgeschritten, aber es hat mir wirklich geholfen, zu verstehen, wie das Flex-Framework funktioniert.

Wie auch immer, auf Ihre eigentliche Frage - wie man etwas animiert. Es gibt viele Möglichkeiten, aber für den Fall, dass Sie nach und nach Text zu einem Etikett hinzufügen, würde ich wahrscheinlich die Klasse Timer verwenden. Hier

ist ein Beispiel:

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

Ein grundlegender Ansatz wäre es, Daten zu verwenden, für den Etikettenwert Bindung und SetTimeout() oder setInterval() die Verzögerung zwischen Änderungen zu bewirken. Hier

ein Beispiel:

<?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> 
Verwandte Themen