Scherminhoud dynamisch laden

Flash Player 9 of hoger, Adobe AIR 1.0 of hoger

U kunt de volgende externe weergave-elementen in een ActionScript 3.0-toepassing laden:

  • Een in ActionScript 3.0 gemaakt SWF-bestand. Dit kan een Sprite-, MovieClip- of andere klasse zijn waardoor Sprite wordt uitgebreid. In AIR-toepassingen op iOS kunnen alleen SWF-bestanden zonder ActionScript-bytecode worden geladen. Dit betekent dat SWF-bestanden met ingesloten gegevens, zoals afbeeldingen en geluid, wel kunnen worden geladen, maar SWF-bestanden met uitvoerbare code niet.

  • Een afbeeldingsbestand, bijvoorbeeld JPG-, PNG- en GIF-bestanden.

  • Een AVM1-SWF-bestand. Dit is een SWF-bestand dat in ActionScript 1.0 of 2.0 is geschreven. (niet ondersteund in mobiele AIR-toepassingen)

U laadt deze elementen met de klasse Loader.

Weergaveobjecten laden

Met een object Loader kunt u SWF-bestanden en bestanden met afbeeldingen in een toepassing laden. De klasse Loader is een subklasse van de klasse DisplayObjectContainer. Een object Loader kan slechts één onderliggend weergaveobject in het weergaveoverzicht bevatten, namelijk het weergaveobject dat het SWF-bestand of afbeeldingsbestand vertegenwoordigt dat door het object wordt geladen. Wanneer u een object Loader aan het weergaveoverzicht toevoegt, zoals in de volgende code, voegt u ook het geladen onderliggende weergaveobject aan het weergaveoverzicht toe zodra het is geladen:

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

Wanneer het SWF-bestand of de afbeelding is geladen, kunt u het geladen weergaveobject naar een andere weergaveobjectcontainer verplaatsen, zoals het DisplayObjectContainer-object container in dit voorbeeld:

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);  
}

De voortgang van het laden controleren

Wanneer het bestand met laden begint, wordt er een object LoaderInfo gemaakt. Een object LoaderInfo biedt bijvoorbeeld informatie over de voortgang van het laden, de URL's van de lader en geladen inhoud, het totale aantal bytes voor de media en de nominale hoogte en breedte van de media. Een object LoaderInfo verzendt ook gebeurtenissen voor het controleren van de voortgang van het laden.

Het volgende diagram toont de verschillende manieren waarop het object LoaderInfo kan worden gebruikt (voor de instantie van de hoofdklasse van het SWF-bestand, voor een object Loader en voor een object dat is geladen door het object Loader):

U hebt toegang tot het object LoaderInfo als een eigenschap van zowel het object Loader en het geladen weergaveobject. Wanneer het laden begint, hebt u toegang tot het object LoaderInfo via de eigenschap contentLoaderInfo van het object Loader. Zodra het laden van het weergaveobject is voltooid, hebt u via de eigenschap loaderInfo van het weergaveobject ook toegang tot het object LoaderInfo als een eigenschap van het geladen weergaveobject. De eigenschap loaderInfo van het geladen weergaveobject verwijst naar hetzelfde object LoaderInfo als de eigenschap contentLoaderInfo van het object Loader. Een object LoaderInfo wordt dus gedeeld tussen een geladen object en het object Loader dat het object heeft geladen (tussen lader en de geladen inhoud).

Als u toegang wilt tot de eigenschappen van de geladen inhoud, moet u een gebeurtenislistener toevoegen aan het object LoaderInfo, zoals getoond in de volgende code:

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; 
}

Zie Gebeurtenissen afhandelen voor meer informatie.

De context van de geladen gegevens opgeven

Wanneer u via de methode load() of loadBytes() van de klasse Loader een extern bestand in Flash Player of AIR laadt, kunt u eventueel een parameter context opgeven. Deze parameter is een object LoaderContext.

De klasse LoaderContext bevat drie eigenschappen waarmee u kunt definiëren hoe de geladen inhoud wordt gebruikt:

  • checkPolicyFile: Gebruik deze eigenschap alleen wanneer u een afbeeldingsbestand laadt (geen SWF-bestand). Als u deze eigenschap instelt op true, controleert de Loader de oorspronkelijke server op een beleidsbestand (zie Controlemiddelen voor websites (beleidsbestanden)). Dit is alleen nodig voor inhoud afkomstig van een ander domein dan het domein van het SWF-bestand dat het object Loader bevat. Als de server bevoegdheden toekent aan het domein van Loader, heeft ActionScript in SWF-bestanden in het domein Loader toegang tot de gegevens in de geladen afbeelding. Met andere woorden, u kunt de opdracht BitmapData.draw() gebruiken om toegang te krijgen tot gegevens in de geladen afbeelding.

    Een SWF-bestand uit een ander domein dan het domein van het object Loader kan Security.allowDomain() aanroepen om een bepaald domein toe te staan.

  • securityDomain: Gebruik deze eigenschap uitsluitend wanneer u een SWF-bestand laadt (geen afbeelding). Geef dit op voor een SWF-bestand uit een ander domein dan het domein van het bestand dat het object Loader bevat. Als u deze optie opgeeft, controleert Flash of er een beleidsbestand aanwezig is. Als dit er is, kunnen SWF-bestanden uit domeinen die in het domeinoverschrijdende beleidsbestand zijn toegestaan cross-scripting uitvoeren op de geladen SWF-inhoud. U kunt flash.system.SecurityDomain.currentDomain als deze parameter opgeven.

  • applicationDomain: Gebruik deze eigenschap uitsluitend wanneer u een SWF-bestand laadt dat in ActionScript 3.0 is geschreven (geen afbeelding of SWF-bestand dat in ActionScript 1.0 of 2.0 is geschreven). Wanneer het bestand wordt geladen, kunt u opgeven dat het bestand in hetzelfde toepassingsdomein moet worden opgenomen als het domein van het object Loader. Dit doet u door de parameter applicationDomain in te stellen op flash.system.ApplicationDomain.currentDomain. Als u het geladen SWF-bestand in hetzelfde toepassingsdomein plaatst, hebt u direct toegang tot de klassen van het bestand. Dit kan nuttig zijn als u een SWF-bestand met ingesloten media laadt, waartoe u toegang hebt via de gekoppelde klassennamen. Zie Werken met toepassingsdomeinen voor meer informatie.

In het volgende voorbeeld ziet u hoe u naar een beleidsbestand zoekt tijdens het laden van een bitmap uit een ander domein:

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);

In het volgende voorbeeld ziet u hoe u naar een beleidsbestand zoekt tijdens het laden van een SWF-bestand uit een ander domein, zodat u het bestand in dezelfde beveiligingssandbox als het Loader-object kunt plaatsen. Bovendien voegt de code de klassen in het geladen SWF-bestand toe aan hetzelfde toepassingsdomein als het Loader-object:

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);

Zie de LoaderContext-klasse in de Naslaggids voor ActionScript 3.0 voor het Adobe Flash-platform voor meer informatie.

SWF-bestanden laden in AIR voor iOS

Op iOS-apparaten zijn er beperkingen op het laden en compileren van code bij uitvoering. Door deze beperkingen zijn er enkele noodzakelijke verschillen in de taak van het laden van externe SWF-bestanden naar uw toepassing:

  • Alle SWF-bestanden die ActionScript-code bevatten, moeten worden opgenomen in het toepassingspakket. Geen SWF-bestand met code kan worden geladen vanaf een externe bron, zoals via een netwerk. Als onderdeel van het in een pakket plaatsen van de toepassing, wordt alle ActionScript-code in alle SWF-bestanden in het toepassingspakket gecompileerd naar native code voor iOS-apparaten.

  • U kunt een SWF-bestand niet laden, verwijderen en vervolgens opnieuw laden. Als u dit probeert te doen, treedt er een fout op.

  • Het gedrag van het laden naar het geheugen en het vervolgens verwijderen is hetzelfde als bij bureaubladplatforms. Als u een SWF-bestand laadt en het vervolgens verwijdert, worden alle visuele elementen in het SWF-bestand uit het geheugen verwijderd. Eventuele klasseverwijzingen naar een ActionScript-klasse in het geladen SWF-bestand echter blijven in het geheugen en zijn toegankelijk in ActionScript-code.

  • Alle geladen SWF-bestanden moeten in hetzelfde toepassingsdomein als het SWF-hoofdbestand worden geladen. Dit is niet de standaardgedraging, dus voor elk SWF-bestand dat u laadt, moet u een LoaderContext-object maken dat het hoofdtoepassingsdomein opgeeft en dat LoaderContext-object doorsturen naar de Loader.load()-methodeaanroep. Als u een SWF-bestand probeert te laden in een ander toepassingsdomein dan het SWF-hoofdtoepassingsdomein, treedt er een fout op. Dit geldt zelfs als het geladen SWF-bestand alleen visuele elementen bevat en geen ActionScript-code.

    Het volgende voorbeeld toont de code die moet worden gebruikt om een SWF-bestand te laden vanaf een toepassingspakket naar het toepassingsdomein van het SWF-hoofdbestand:

    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);

Een SWF-bestand laadt alleen elementen en er kan geen code worden geladen vanaf het toepassingspakket of via een netwerk. In elk geval moet het SWF-bestand nog steeds naar het hoofdtoepassingsdomein worden geladen.

Voor AIR-versies vóór AIR 3.6 wordt tijdens het compileren alle code van andere SWF-bestanden dan het SWF-bestand van de hoofdtoepassing verwijderd. SWF-bestanden die alleen visuele elementen bevatten, kunnen worden opgenomen in het toepassingspakket en bij uitvoering worden geladen, maar geen code. Als u een SWF-bestand dat ActionScript-code bevat, probeert te laden, treedt er een fout op. Door de fout verschijnt er een foutdialoogvenster "Niet-gecompileerde ActionScript" in de toepassing.

Zie ook

Meerdere SWF-bestanden in AIR-toepassingen op iOS in een pakket plaatsen en laden

De klassen ProLoader en ProLoaderInfo gebruiken

Flash Professional CS5.5 introduceert de klassen fl.display.ProLoader en fl.display.ProLoaderInfo. Hiermee wordt het voorladen van een RSL nog eenvoudiger. Deze klassen vormen een spiegelbeeld van de klassen flash.display.Loader en flash.display.LoaderInfo, maar ze bieden een meer consistent laadgedrag.

Met de klasse ProLoader kunt u SWF-bestanden laden waarbij TLF wordt gebruikt in combinatie met het voorladen van een RSL. Tijdens runtime is bij SWF-bestanden die andere SWF-bestanden of SWZ-bestanden (zoals TLF) voorladen, een intern, omsluitend SWF-bestand vereist. Door deze extra complexiteit van het omsluitende SWF-bestand treedt soms ongewenst gedrag op. Dit probleem wordt opgelost door de ProLoader-klasse, waarmee dergelijke bestanden net zo worden geladen als standaard-SWF-bestanden. Deze oplossing is transparant voor de gebruiker en vereist geen special afhandeling in ActionScript. Bovendien wordt standaard-SWF-inhoud correct geladen door ProLoader.

In Flash Professional CS 5.5 en hoger kunt u veilig alle instanties van de Loader-klasse vervangen door instanties van de ProLoader-klasse. Vervolgens exporteert u uw toepassing naar Flash Player 10.2 of hoger, zodat de vereiste ActionScript-functionaliteit toegankelijk is voor ProLoader. U kunt ProLoader ook gebruiken wanneer u producten ontwerpt voor eerdere versies van Flash Player die ondersteuning bieden voor ActionScript 3.0. De volledige functionaliteit van ProLoader kan echter alleen worden ontsloten met Flash Player 10.2 of hoger. Gebruik altijd ProLoader wanneer u TLF in Flash Professional CS5.5 of hoger gebruikt. ProLoader is niet vereist in andere omgevingen dan Flash Professional.

Belangrijk: Voor SWF-bestanden die zijn gepubliceerd in Flash Professional CS5.5 en hoger, kunt u altijd de klassen fl.display.ProLoader en fl.display.ProLoaderInfo gebruiken in plaats van de klassen flash.display.Loader en flash.display.LoaderInfo.

Problemen die zijn opgelost door de ProLoader-klasse

De ProLoader-klasse biedt oplossingen voor problemen die niet kunnen worden afgehandeld door de bestaande Loader-klasse. De basis voor deze problemen ligt in het RSL-voorladen van TLF-bibliotheken. Dit is specifiek van toepassing op SWF-bestanden die een Loader-object gebruiken om andere SWF-bestanden te laden. De oplossing is onder meer van toepassing op de volgende problemen:

  • Scripting tussen het bestand dat wordt geladen en het al geladen bestand werkt niet zoals verwacht. Door de ProLoader-klasse wordt het SWF-bestand dat wordt geladen, automatisch ingesteld als het bovenliggende element van het geladen SWF-bestand. Alle communicatie van het SWF-bestand dat wordt geladen wordt rechtstreeks verzonden naar het al geladen SWF-bestand.

  • De SWF-toepassing moet het laadproces actief beheren. Hiertoe moeten extra gebeurtenissen worden geïmplementeerd, zoals added, removed, addedToStage en removedFromStage. Als uw toepassing is ontworpen voor Flash Player 10.2 of hoger, zijn deze extra stappen niet nodig dankzij ProLoader.

Code bijwerken van Loader naar ProLoader

Aangezien de ProLoader-klasse een spiegelbeeld is van de Loader-klasse, kunt u de oude Loader-klasse in uw code eenvoudig vervangen door de nieuwe Proloader-klasse. Het volgende voorbeeld laat zien hoe u de bestaande code kunt bijwerken naar de nieuwe klasse:

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!'); 
}

U kunt deze code als volgt bijwerken naar de ProLoader-klasse:

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!'); 
}