Dez 08 2010

Actionscript – Zeichenabstände bei dynamischen Textfeldern beibehalten

Tag: Actionscript,AdobeKonstantin Elstner @ 15:41

Bei einem letzten Projekt mussten wir mit statischen Textfeldern arbeiten und haben dabei einige interessante Tweaks kennen gelernt.

An dieser Stelle ein Trick bezüglich dynamischer Textfelder, die in der IDE erstellt wurden und später mit Inhalten befüllt werden. Etliche User berichten, dass in diesem Fall die Einstellungen für den Zeichenabstand (manchmal) und den Zeilenabstand (immer) verloren gehen, dies lässt sich sowohl in Actionscript 2.0 wie auch 3.0 wie folgt umgehen:


import flash.text.TextField;

import flash.text.TextFormat;

var tf:TextField = this.textfeldInstanz;
var txtFormat:TextFormat = tf.getTextFormat();

tf.text = „Lorem ipsum et minim causae persequeris sit, ea diam habemus nam. Ad pri laudem epicuri“;

tf.setTextFormat( txtFormat );

Der Trick besteht darin – das Textformat vor dem Setzen des neuen Textes auszulesen und nach dem Setzen des neuen Textes wieder auf das Textfeld anzuwenden. Setzt man einfach nur den neuen Text, so wird das Textformat in den Punkten Zeichen– und Zeilenabstand auf die Standardwerte zurück gesetzt.


Dez 07 2010

Adobes FLVPlayback korrekt stoppen

Tag: Actionscript,AdobeKonstantin Elstner @ 20:23

Wenn man als Actionscript-Entwickler ohne viel Aufwand ein Video einbinden möchte, gibt es aktuell neben Drittanbietern zwei Angebote / Lösungsansätze die direkt von Adobe kommen:

OSMF ist Adobes neues Mediaframework, das mehr oder weniger leistungsstark ist, jedoch setzt dies mindestens den Flash Player 10 voraus, daher ist es leider noch für viele Flashprojekte nicht die erste Wahl.

Daher bleibt für eine „schnelle“ Umsetzung meist nur die FLVPlayback Komponente. Aus persönlicher Erfahrung weiß ich, dass diese freundlich formuliert, so einige unschöne Features hat, bzw. stellenweise mangelhaft ist.

Eines der wohl größten Probleme ist das Szenario, dass der User ein Popup mit einem Video öffnet, der Player startet, aber bevor der Player die eigentliche Wiedergabe visuell startet, schließt der User schon das Popup. Nun beginnt aber plötzlich im Hintergrund der Sound des Videos zu laufen.

In der Regel würde man den Player versuchen wie folgt zu stoppen:

playerInstanz.stop();

Dies greift aber noch nicht, wenn der hinter dem Video stehende Netstream / VideoPlayer sich noch versucht zu verbinden, dies passiert häufig bei größeren progressiven Filmdownloads.

Adobe hat es leider nicht für notwendig gehalten eine destroyMethode bei zu packen.  Beim internen Handling eines Videos verfährt die Adobe FLVPlayback Komponente wie folgt:

  • VideoURL wird gesetzt
  • Ein Netstream / VideoPlayer-Objekt wird erstellt, dem Event-Listener für alle verschiedenen Events wie Complete, Connect, IOError etc. hinzugefügt werden
  • Das Netstream / VideoPlayer-Objekt wird dem internen Array „videoPlayers“ hinzugefügt
  • Erst bei Connect- oder einem Error-Event ist das Netstream / VideoPlayer-Objekt durch die public Methoden der FLVPlayback Komponente steuerbar

… daher wird die FLVPlayback Komponente vor dem Connect-Event über die public Methoden angesteuert, so laufen diese Befehle ins Leere. Setzt man die FLVPlayback Komponente gar auf NULL, so verbleibt der laufende Stream als verweislose Instanz im Speicher bis der Garbage Collector diese bereinigt. Bis dahin ist jedoch der Sound des Videos hörbar und der Netstream / VideoPlayer nicht mehr kontrollier- oder stoppbar.

Bryan Grezeszak war so freundlich und hat sich dieses Problems mit seiner Klasse FLVPlaybackUtils angenommen.

FLVPlaybackUtils verfügt über eine public Methode:

  • reset(vid: FLVPlayback) – Stoppt alle laufenden Videos der FLVPlayback Komponente und resettet diese, sodass nur noch ein „frischer“ interner Netstream / VideoPlayer vorhanden ist

Endlich keine verbleibenden Videogeister mehr!

Enjoy