Dynamisk inläsning av visningsinnehåll

Flash Player 9 och senare, Adobe AIR 1.0 och senare

Du kan läsa in någon av följande externa visningsresurser till ett program i ActionScript 3.0:

  • En SWF-fil som har skapats i ActionScript 3.0 – den här filen kan ha klassen Sprite, MovieClip eller någon annan klass som utökar Sprite.

  • En bildfil – dessa är JPG-, PNG- och GIF-filer.

  • En AVM1 SWF-fil – detta är en SWF-fil skriven i ActionScript 1.0 eller 2.0.

Inläsning av resurserna görs via klassen Loader.

Inläsning av visningsobjekt

Loader-objekt används för att läsa in SWF-filer och grafikfiler till ett program. Klassen Loader är en underklass till klassen DisplayObjectContainer. Ett Loader-objekt kan innehålla endast ett underordnat visningsobjekt i sin visningslista – visningsobjektet som motsvarar SWF-filen eller grafikfilen som läses in. När du lägger ett Loader-objekt till visningslistan, som i nedanstående kod, kan du även lägga till det inlästa underordnade visningsobjektet till visningslistan efter inläsningen:

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

När SWF-filen eller bilden är inläst kan du flytta visningsobjektet till en annan behållare för visningsobjekt, till exempel DisplayObjectContainer-objektet container i detta exempel:

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

Övervaka inläsningsförloppet

När filen har börjat läsas in skapas objektet LoaderInfo. Ett LoaderInfo-objekt innehåller information om inläsningsförloppet, inläsarens och utläsarens URL-adresser, det sammanlagda antalet byte för mediet samt mediets nominella höjd och bredd. Ett LoaderInfo-objekt skickar även händelser som övervakar förloppet av inläsningen.

I följande diagram visas hur LoaderInfo-objektet kan användas – för huvudklassinstansen i SWF-filen, för ett Loader-objekt och för ett objekt inläst via Loader-objektet:

Objektet LoaderInfo är tillgängligt som egenskap för både Loader-objektet och det inlästa visningsobjektet. Så snart inläsningen påbörjas blir LoaderInfo-objektet tillgängligt via egenskapen contentLoaderInfo i Loader-objektet. När visningsobjektet är inläst blir LoaderInfo-objektet tillgängligt även som egenskap för det inlästa visningsobjektet via egenskapen loaderInfo. Egenskapen loaderInfo för det inlästa visningsobjektet refererar till samma LoaderInfo-objekt som egenskapen contentLoaderInfo för Loader-objektet. Ett LoaderInfo-objekt delas m.a.o. mellan ett inläst objekt och det Loader-objekt som läste in det (mellan inläsare och utläsare).

För att få tillgång till egenskaper för inläst innehåll måste du lägga till en händelseavlyssnare till LoaderInfo-objektet enligt följande:

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

Mer information finns i Hantera händelser.

Ange innehåll för inläsning

När du läser in en extern fil till Flash Player via metoderna load() eller loadBytes() i klassen Loader kan du välja att ange parametern context. Denna parameter är objektet LoaderContext.

Klassen LoaderContext innehåller tre egenskaper som du anger för att definiera hur inläst innehåll ska användas:

  • checkPolicyFile: Använd den här egenskapen endast när du läser in en bildfil (inte en SWF-fil). Om du anger egenskapen till true kontrolleras om det finns en principfil på den ursprungliga servern (se Webbplatsinställningar (principfiler)). Detta är endast nödvändigt för innehåll som kommer från andra domäner än den som SWF-filen med Loader-objektet kommer från. Om servern ger Loader-domänen tillstånd så kan ActionScript från SWF-filer i domänen få dataåtkomst till den inlästa bilden. Du kan m.a.o. använda kommandot BitmapData.draw() för att få åtkomst till data i den inlästa bilden.

    Observera att en SWF-fil från andra domäner än den som Loader-objektet kan anropa Security.allowDomain() för att tillåta en specifik domän.

  • securityDomain: Använd bara den här egenskapen när du läser in en SWF-fil (inte en bild). Ange den här för en SWF-fil från en annan domän än den som filen med Loader-objektet har. När du anger detta alternativ görs en sökning efter en korsdomänprincip och om sådan finns kan inläst SWF-innehåll korsskriptas av SWF-filer i de domäner som ges tillstånd med korsdomänprincipen. Du kan ange flash.system.SecurityDomain.currentDomain som denna parameter.

  • applicationDomain: Använd bara den här egenskapen när du läser in en SWF-fil som är skriven i ActionScript 3.0 (inte en bild eller SWF-fil som är skriven i ActionScript 1.0 eller 2.0). Vid inläsning av filen kan du ange att filen ska ingå i samma programdomän som Loader-objektet. Detta gör du genom att ange parametern applicationDomain med flash.system.ApplicationDomain.currentDomain. Genom att placera den inlästa SWF-filen i samma programdomän får du direktåtkomst till klasserna. Detta är praktiskt om du läser in en SWF-fil som innehåller inbäddade medier, som du får tillgång till via associerade klassnamn. Mer information finns i Arbeta med programdomäner.

Här är ett exempel på sökning efter en principfil vid inläsning av en bitmapp från en annan domän:

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

Här visas ett exempel på sökning efter en principfil vid inläsning av en SWF-fil från en annan domän, för placering av filen i samma säkerhetssandlåda som Loader-objektet. Med koden läggs dessutom klasserna i den inlästa SWF-filen till i samma programdomän som Loader-objektet:

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

Mer information finns i klassbeskrivningen för LoaderContext i Referenshandbok för ActionScript 3.0 i Adobe Flash-plattformen.