Dynamisches Laden von Anzeigeinhalten

Flash Player 9 und höher, Adobe AIR 1.0 und höher

Sie können eines der folgenden externen Anzeigeelemente in eine ActionScript 3.0-Anwendung laden:

  • Eine in ActionScript 3.0 erstellte SWF-Datei – diese Datei kann ein Sprite, MovieClip oder eine andere Klasse sein, die Sprite erweitert. In AIR-Anwendungen unter iOS können nur SWF-Dateien, die keinen ActionScript-Bytecode enthalten, geladen werden. SWF-Dateien mit eingebetteten Daten, wie Bilder und Sound, können also geladen werden, nicht aber SWF-Dateien, die ausführbaren Code enthalten.

  • Eine Bilddatei – hierzu gehören JPG-, PNG- und GIF-Dateien.

  • Eine AVM1 SWF-Datei – dies ist eine in ActionScript 1.0 oder 2.0 geschriebene SWF-Datei. (nicht in mobilen AIR-Anwendungen unterstützt)

Diese Anzeigeelemente können Sie mit der Loader-Klasse laden.

Laden von Anzeigeobjekten

Loader-Objekte dienen zum Laden von SWF- und Grafikdateien in eine Anwendung. Die Loader-Klasse ist eine Unterklasse der DisplayObjectContainer-Klasse. Ein Loader-Objekt kann nur ein untergeordnetes Anzeigeobjekt in seiner Anzeigeliste enthalten – das Anzeigeobjekt, das die geladene SWF- oder Grafikdatei darstellt. Wenn Sie der Anzeigeliste ein Loader-Objekt hinzufügen (wie im folgenden Code), haben Sie der Anzeigeliste auch das geladene untergeordnete Anzeigeobjekt hinzugefügt (nachdem es geladen wurde):

var pictLdr:Loader = new Loader(); 
var pictURL:String = "banana.jpg" 
var pictURLReq:URLRequest = new URLRequest(pictURL); 
pictLdr.load(pictURLReq); 
this.addChild(pictLdr);

Wenn die SWF-Datei oder das Bild geladen ist, können Sie das geladene Anzeigeobjekt in einen anderen Anzeigeobjektcontainer verschieben, z. B. in das DisplayObjectContainer-Objekt container im folgenden Beispiel:

import flash.display.*; 
import flash.net.URLRequest; 
import flash.events.Event; 
var container:Sprite = new Sprite(); 
addChild(container); 
var pictLdr:Loader = new Loader(); 
var pictURL:String = "banana.jpg" 
var pictURLReq:URLRequest = new URLRequest(pictURL); 
pictLdr.load(pictURLReq); 
pictLdr.contentLoaderInfo.addEventListener(Event.COMPLETE, imgLoaded);  
function imgLoaded(event:Event):void 
{ 
    container.addChild(pictLdr.content);  
}

Überwachen des Ladefortschritts

Wenn das Laden der Datei gestartet wurde, wird ein LoaderInfo-Objekt erstellt. Ein LoaderInfo-Objekt enthält Informationen wie den Ladefortschritt, die URLs des ladenden und des geladenen Objekts, die Gesamtanzahl der Bytes für das Medium und die nominelle Höhe und Breite des Mediums. Ein LoaderInfo-Objekt löst darüber hinaus Ereignisse zur Überwachung des Ladefortschritts aus.

Das folgende Diagramm zeigt die verschiedenen Einsatzmöglichkeiten des LoaderInfo-Objekts – für die Instanz der Hauptklasse der SWF-Datei, für ein Loader-Objekt und für ein vom Loader-Objekt geladenes Objekt:

Auf das LoaderInfo-Objekt kann als Eigenschaft des Loader-Objekts und des geladenen Anzeigeobjekts zugegriffen werden. Sobald das Laden begonnen hat, kann über die Eigenschaft contentLoaderInfo des Loader-Objekts auf das LoaderInfo-Objekt zugegriffen werden. Wenn das Anzeigeobjekt vollständig geladen ist, kann über die Eigenschaft loaderInfo des Anzeigeobjekts als Eigenschaft des geladenen Anzeigeobjekts auf das LoaderInfo-Objekt zugegriffen werden. Die Eigenschaft loaderInfo des geladenen Anzeigeobjekts verweist auf das gleiche LoaderInfo-Objekt wie die Eigenschaft contentLoaderInfo des Loader-Objekts. Anders ausgedrückt, das geladene Objekt und das Loader-Objekt, das es geladen hat, verwenden dasselbe LoaderInfo-Objekt.

Um auf die Eigenschaften des geladenen Inhalts zugreifen zu können, müssen Sie dem LoaderInfo-Objekt einen Ereignis-Listener hinzufügen, wie im folgenden Code dargestellt:

import flash.display.Loader; 
import flash.display.Sprite; 
import flash.events.Event; 
 
var ldr:Loader = new Loader(); 
var urlReq:URLRequest = new URLRequest("Circle.swf"); 
ldr.load(urlReq); 
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, loaded); 
addChild(ldr); 
 
function loaded(event:Event):void 
{ 
    var content:Sprite = event.target.content; 
    content.scaleX = 2; 
}

Weitere Informationen finden Sie unter Verarbeiten von Ereignissen.

Festlegen des Ladekontexts

Wenn Sie eine externe Datei über die load()- oder loadBytes()-Methode der Loader-Klasse in Flash Player oder AIR laden, können Sie optional einen context-Parameter angeben. Bei diesem Parameter handelt es sich um ein LoaderContext-Objekt.

Die LoaderContext-Klasse umfasst drei Eigenschaften, mit denen Sie den Kontext definieren können, wie der geladene Inhalt verwendet werden kann:

  • checkPolicyFile: Verwenden Sie diese Eigenschaft nur beim Laden einer Bilddatei (nicht beim Laden einer SWF-Datei). Wenn Sie diese Eigenschaft auf true festlegen, sucht der Loader auf dem Ursprungsserver nach einer Richtliniendatei (siehe Kontrolloptionen für Websites (Richtliniendateien)). Dies ist nur dann notwendig, wenn Inhalte aus anderen Domänen stammen als die SWF-Datei, in der das Loader-Objekt enthalten ist. Wenn der Server Zugriff auf die Loader-Domäne gewährt, kann ActionScript aus SWF-Dateien in der Loader-Domäne auf Daten im geladenen Bild zugreifen. Anders ausgedrückt, Sie können mit dem Befehl BitmapData.draw() auf Daten im geladenen Bild zugreifen.

    Beachten Sie, dass eine SWF-Datei aus einer anderen Domäne als das Loader-Objekt Security.allowDomain() aufrufen kann, um eine bestimmte Domäne zuzulassen.

  • securityDomain: Verwenden Sie diese Eigenschaft nur beim Laden einer SWF-Datei (nicht beim Laden eines Bilds). Dies ist nur dann notwendig, wenn eine SWF-Datei aus einer anderen Domäne stammt als die Datei, die das Loader-Objekt enthält. Wenn Sie diese Option angeben, sucht Flash Player nach einer Richtliniendatei. Ist eine vorhanden, können SWF-Dateien aus Domänen, die in der domänenübergreifenden Richtliniendatei enthalten sind, auf den geladenen SWF-Inhalt verweisen (Cross-Scripting). Sie können flash.system.SecurityDomain.currentDomain als Parameter angeben.

  • applicationDomain: Verwenden Sie diese Eigenschaft nur beim Laden einer SWF-Datei, die in ActionScript 3.0 geschrieben wurde (nicht beim Laden eines Bilds oder einer SWF-Datei, die in ActionScript 1.0 oder 2.0 geschrieben wurde). Beim Laden der Datei können Sie festlegen, ob die Datei in die gleiche Anwendungsdomäne wie die des Loader-Objekts aufgenommen werden soll, indem Sie den Parameter applicationDomain auf flash.system.ApplicationDomain.currentDomain einstellen. Durch Einfügen der geladenen SWF-Datei in die gleiche Anwendungsdomäne können Sie direkt auf die zugehörigen Klassen zugreifen. Dies ist insbesondere beim Laden einer SWF-Datei von Nutzen, die eingebettete Medien enthält, auf die Sie über denen zugewiesenen Klassennamen zugreifen können. Weitere Informationen finden Sie unter Verwenden von Anwendungsdomänen.

Im Folgenden ist ein Beispiel für die Suche nach einer Richtliniendatei aufgeführt, wenn eine Bitmap aus einer anderen Domäne geladen wird:

var context:LoaderContext = new LoaderContext(); 
context.checkPolicyFile = true; 
var urlReq:URLRequest = new URLRequest("http://www.[your_domain_here].com/photo11.jpg"); 
var ldr:Loader = new Loader(); 
ldr.load(urlReq, context);

Im Folgenden ist ein Beispiel für die Suche nach einer Richtliniendatei aufgeführt, wenn eine SWF-Datei aus einer anderen Domäne geladen wird, um diese Datei in der gleichen Sicherheits-Sandbox wie das Loader-Objekt zu platzieren. Darüber hinaus fügt der Code die Klassen in der geladenen SWF-Datei der gleichen Anwendungsdomäne wie das Loader-Objekt hinzu:

var context:LoaderContext = new LoaderContext(); 
context.securityDomain = SecurityDomain.currentDomain; 
context.applicationDomain = ApplicationDomain.currentDomain; 
var urlReq:URLRequest = new URLRequest("http://www.[your_domain_here].com/library.swf"); 
var ldr:Loader = new Loader(); 
ldr.load(urlReq, context);

Weitere Informationen finden Sie in der Beschreibung der LoaderContext-Klasse im ActionScript 3.0-Referenzhandbuch für die Adobe Flash-Plattform.

Laden von SWF-Dateien in AIR für iOS

Auf iOS-Geräten ist das Laden und Kompilieren von Code zur Laufzeit beschränkt. Aufgrund dieser Beschränkungen weist das Laden externer SWF-Dateien in Ihre Anwendung einige notwendige Unterschiede auf:

  • Alle SWF-Dateien mit ActionScript-Code müssen im Anwendungspaket enthalten sein. SWF-Dateien, die Code enthalten, können nicht aus einer externen Quelle (z. B. über ein Netzwerk) geladen werden. Als Teil des Verpackens der Anwendung wird der gesamte ActionScript-Code in allen SWF-Dateien des Anwendungspakets in nativen Code für iOS-Geräte kompiliert.

  • Sie können eine SWF-Datei nicht laden, entladen und dann erneut laden. Wenn Sie dies versuchen, tritt ein Fehler auf.

  • Beim Laden in den Arbeitsspeicher und bei anschließendem Entladen ist das Verhalten identisch mit dem in Desktop-Plattformen. Wenn Sie eine SWF-Datei laden und dann entladen, werden alle visuellen Elemente in der SWF-Datei aus dem Arbeitsspeicher entfernt. Alle Klassenverweise zu einer ActionScript-Klasse in der geladenen SWF-Datei bleiben jedoch im Arbeitsspeicher erhalten und können über den ActionScript-Code aufgerufen werden.

  • Alle geladenen SWF-Dateien müssen in dieselbe Anwendungsdomäne wie die Haupt-SWF-Datei geladen werden. Dies ist nicht das Standardverhalten. Daher müssen Sie für jede zu ladende SWF-Datei ein LoaderContext-Objekt erstellen, das die Hauptanwendungsdomäne angibt, und das LoaderContext-Objekt an den Aufruf der Loader.load()-Methode übergeben. Wenn Sie versuchen, die SWF-Datei in eine andere Anwendungsdomäne als die Anwendungsdomäne der Haupt-SWF-Datei zu laden, tritt ein Fehler auf. Dies trifft auch zu, wenn die geladene SWF-Datei nur visuelle Elemente und keinen ActionScript-Code enthält.

    Das folgende Beispiel zeigt den Code, mit dem eine SWF-Datei aus dem Anwendungspaket in die Anwendungsdomäne der Haupt-SWF-Datei geladen wird:

    var loader:Loader = new Loader(); 
    var url:URLRequest = new URLRequest("swfs/SecondarySwf.swf"); 
    var loaderContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain, null); 
    loader.load(url, loaderContext);

Eine SWF-Datei, die nur Elemente und keinen Code enthält, kann aus dem Anwendungspaket oder über ein Netzwerk geladen werden. In jedem Fall muss die SWF-Datei weiterhin in die Hauptanwendungsdomäne geladen sein.

Bei AIR-Versionen vor AIR 3.6 wird der gesamte Code bei der Kompilierung aus den SWF-Dateien (außer der Haupt-SWF-Datei der Anwendung) entfernt. SWF-Dateien, die nur visuelle Elemente (jedoch keinen Code) enthalten, können in das Anwendungspaket eingebunden und zur Laufzeit geladen werden. Wenn Sie eine SWF-Datei mit ActionScript-Code laden, tritt ein Fehler auf. Daraufhin wird in der Anwendung eine Fehlermeldung zu nicht kompiliertem ActionScript-Code angezeigt.

Siehe auch

Packaging and loading multiple SWFs in AIR apps on iOS

Verwenden der ProLoader- und ProLoaderInfo-Klassen

Als Hilfe zum Vorausladen von gemeinsam genutzten Remote-Bibliotheken (RSL, Remote Shared Library) wurden in Flash Professional CS5.5 die fl.display.ProLoader- und fl.display.ProLoaderInfo-Klassen eingeführt. Diese Klassen ähneln den flash.display.Loader- und flash.display.LoaderInfo-Klassen, bieten jedoch ein einheitlicheres Verhalten beim Laden.

Insbesondere ProLoader ist zum Laden von SWF-Dateien nützlich, die das Text Layout Framework (TLF) mit dem RSL-Vorausladen verwenden. SWF-Dateien, die andere SWF-Dateien oder SWZ-Dateien vorausladen, wie beispielsweise TLF, erfordern zur Laufzeit eine rein interne SWF-Wrapper-Datei. Da die SWF-Wrapper-Datei zusätzliche Komplexität verursacht, kann ein unerwartetes Verhalten auftreten. ProLoader löst diese Probleme bezüglich der Komplexität und lädt die Dateien wie normale SWF-Dateien. Die von der ProLoader-Klasse bereitgestellte Lösung ist für den Benutzer transparent und erfordert keine besondere Verarbeitung in ActionScript. Außerdem wird regulärer SWF-Inhalt mit ProLoader korrekt geladen.

In Flash Professional ab CS5.5 können Sie alle Vorkommen der Loader-Klasse problemlos durch die ProLoader-Klasse ersetzen. Exportieren Sie Ihre Anwendung dann in Flash Player 10.2 oder höher, damit ProLoader auf die erforderliche ActionScript-Funktionalität zugreifen kann. Sie können ProLoader auch für frühere Versionen von Flash Player verwenden, die ActionScript 3.0 unterstützen. Das volle Funktionsspektrum von ProLoader steht jedoch erst ab Flash Player 10.2 zur Verfügung. Verwenden Sie mit TLF in Flash Professional CS5.5 oder höher immer ProLoader. ProLoader wird in anderen Umgebungen außer Flash Professional nicht benötigt.

Wichtig: Für SWF-Dateien, die in Flash Professional CS5.5 oder höher veröffentlicht werden, können Sie immer die fl.display.ProLoader- und fl.display.ProLoaderInfo-Klassen anstelle von flash.display.Loader und flash.display.LoaderInfo verwenden.

Von der ProLoader-Klasse behobene Probleme

Die ProLoader-Klasse behebt Probleme, die mit der älteren Loader-Klasse nicht bewältigt werden konnten. Diese Probleme sind auf das RSL-Vorausladen von TLF-Bibliotheken zurückzuführen. Insbesondere betrifft dies SWF-Dateien, die ein Loader-Objekt verwenden, um andere SWF-Dateien zu laden. Zu den behobenen Problemen gehören:

  • Die Skripterstellung zwischen der ladenden Datei und der geladenen Datei verhält sich nicht wie erwartet. Die ProLoader-Klasse legt die ladende SWF-Datei automatisch als übergeordnetes Objekt der geladenen SWF-Datei fest. Deshalb erfolgt die Kommunikation von der ladenden SWF-Datei direkt an die geladene SWF-Datei.

  • Die SWF-Anwendung muss den Ladevorgang aktiv verwalten. Dazu müssen zusätzliche Ereignisse implementiert werden, wie added, removed, addedToStage und removedFromStage. Wenn Ihre Anwendung für Flash Player 10.2 oder höher vorgesehen ist, kann diese zusätzliche Arbeit mithilfe von ProLoader vermieden werden.

Aktualisieren von Code zur Verwendung von ProLoader anstelle von Loader

Da ProLoader der Loader-Klasse ähnelt, können Sie die beiden Klassen in Ihrem Code ganz einfach austauschen. Das folgende Beispiel zeigt, wie vorhandener Code zur Verwendung der neuen Klasse aktualisiert wird:

import flash.display.Loader; 
import flash.events.Event; 
var l:Loader = new Loader(); 
 
addChild(l); 
l.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete); 
l.load("my.swf"); 
function loadComplete(e:Event) { 
    trace('load complete!'); 
}

Dieser Code kann folgendermaßen für die Verwendung von ProLoader geändert werden:

import fl.display.ProLoader; 
import flash.events.Event; 
var l:ProLoader = new ProLoader(); 
 
addChild(l); 
l.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete); 
l.load("my.swf"); 
function loadComplete(e:Event) { 
    trace('load complete!'); 
}