Zeit messen mit der Timer-Klasse

In ActionScript 3 gibt es eine neue Timer-Klasse (flash.utils.Timer), die für zeitbasierte Anwendungszwecke gedacht ist. Ein Timer löst nach einem definierten Zeitintervall ein Event aus. Zusätzlich kann bestimmt werden, ob der Timer "unendlich" lange läuft oder nach einer bestimmten Anzahl an ausgelösten Events aufhört (z.B. nach 10x in einem Intervall von 500ms).

Ein Timer in ActionScript 3 kann somit die aus ActionScript 2 bekannten Funktion setInterval, setTimeout() oder auch das onEnterFrame-Event ersetzen. (Die Funktionen setInterval/setTimeout sind zwar noch in ActionScript 3 vorhanden, erzeugen jedoch Compiler-Warnungen.)

Für Video-Anwendungen mit AS3 ist die Timer-Klasse – in Verbindung mit NetConnection/NetStream – in folgenden Anwendungsbereichen wichtig:

  • Zeitanzeige eines Videos aktualisieren
  • Aktualisieren eines Fortschrittsbalken (wie weit ist das Video geladen)
  • Seek- bzw. Scrubbar zur Steuerung des Videos aktualisieren
  • ...

Für ausführliche Beispiele mit ActionScript 2 verweise ich auf "Interaktives Video im Internet mit Flash" (Kapitel 14: ActionScript-Klassen für die Video-Wiedergabe).

How-to: Timer verwenden

Im folgenden Anschauungsbeispiel wird der Timer dazu genutzt, die aktuelle Zeit eines Videos (NetStream.time) in einem Textfeld anzuzeigen. Beispiel anschauen

Zuerst müssen zwei Klassen importiert werden: flash.utils.Timer und
flash.events.TimerEvent.

Actionscript:
  1. import flash.utils.Timer;      
  2. import flash.events.TimerEvent;

Daraufhin wird ein neues Objekt mit dem Instanznamen myTimer geschaffen. Der Konstruktor wird mit zwei Parametern ausgestattet: dem Zeitintervall in Millisekunden (notwendig) und der Anzahl der Wiederholungen (optional).

Actionscript:
  1. var myTimer:Timer = new Timer(200, 0);

Im konkreten Beispiel wird der Timer alle 200 Millisekunden ausgelöst. Möchte man, dass der Timer "unendlich" lange läuft, gibt man als Anzahl der Wiederholungen 0 an oder lässt den Parameter einfach weg. Schreibt man stattdessen eine konkrete Zahl größer als Null, z.B. 15, wieder der Timer genau so oft ausgeführt (also 15x).

Als nächsten Schritt muss ein EventListener hinzugefügt werden. Dieser ist nötig, damit der Timer weiß, welche Funktion jeweils nach dem Auslösen eines Events gestartet werden soll. In Beispiel heißt die Funktion updateDisplay und sorgt dafür, dass die aktuelle Zeit des Videos in einem Textfeld angezeigt wird.

Actionscript:
  1. myTimer.addEventListener("timer", updateDisplay);

Um den Timer loslaufen zu lassen, muss er nach dem Anfügen des Eventlistener noch mit myTimer.start() gestartet werden. Ein Timer-Objekt hat übrigens (neben dem Konstruktor) drei Methoden:

  • Timer.start(): Startet den Timer.
  • Timer.stop(): Stoppt den Timer.
  • Timer.reset(): Setzt den Timer wieder in den Ursprungszustand (also auf 0).

Im Folgenden der komplette Beispielcode am Stück. Für die Videowiedergabe mit AS3 gibt's bereits einen Artikel hier im Blog. Die .fla-Datei zum Beispiel: download.

Actionscript:
  1. // ::::::: Video ::::::
  2.  
  3. var myVideo:Video = new Video(400,300);
  4. addChild(myVideo);
  5. myVideo.x = 50;
  6. myVideo.y = 50;
  7.  
  8. var nc:NetConnection = new NetConnection();
  9. nc.connect(null);
  10.  
  11. var ns:NetStream = new NetStream(nc);
  12. myVideo.attachNetStream(ns);
  13. ns.play("sand.flv");
  14.  
  15. var customClient:Object = new Object(); // neues Objekt für die Meldungen
  16. ns.client = customClient;
  17.  
  18.  
  19. // ::::::: Textfield ::::::
  20.  
  21. import flash.text.TextField;
  22. var tf:TextField = new TextField();
  23. addChild(tf);
  24. tf.width = 200;
  25. tf.x = 50;
  26. tf.y = 20;
  27.  
  28.  
  29.  
  30. // ::::::: Timer ::::::
  31.  
  32. // Timer Klasse und Events vom Typ "TimerEvent" importieren
  33. import flash.utils.Timer;      
  34. import flash.events.TimerEvent;   
  35.  
  36. var myTimer:Timer = new Timer(200, 0); // neuer Timer: alle 200ms, unendliche Wiederholungen
  37. myTimer.addEventListener("timer", updateDisplay)// Eventlistener hinzufügen
  38. myTimer.start();
  39.  
  40. // Funktion, die vom Timer alle 200ms aufgerufen wird
  41. function updateDisplay(event:TimerEvent):void {
  42.         tf.text = "Aktuelle Zeit: " + ns.time; // Textfeld aktualisieren
  43. }

Link: Timer-Klasse (ActionScript 3 Reference)