Carga dinámica de contenido de visualización

Flash Player 9 y posterior, Adobe AIR 1.0 y posterior

En una aplicación de ActionScript 3.0, se puede cargar cualquiera de los siguientes activos de visualización externos:

  • Un archivo SWF creado en ActionScript 3.0: este archivo puede ser un objeto Sprite, MovieClip o de cualquier clase que amplíe Sprite. En aplicaciones de AIR en iOS, solo se pueden cargar archivos SWF que no contienen código de bytes de ActionScript. Esto significa que los archivos SWF que contienen datos incorporados, como imágenes o sonido, se podrán cargar, pero no los archivos SWF que contengan código ejecutable.

  • Un archivo de imagen: por ejemplo, archivos JPG, PNG y GIF.

  • Un archivo SWF AVM1: un archivo SWF escrito en ActionScript 1.0 o 2.0. (no se admite en aplicaciones de AIR para móviles)

Estos activos se cargan mediante la clase Loader.

Carga de objetos de visualización

Los objetos Loader se usan para cargar archivos SWF y archivos de gráficos en una aplicación. La clase Loader es una subclase de la clase DisplayObjectContainer. Un objeto Loader solo puede contener un objeto de visualización secundario en su lista de visualización: el objeto de visualización que representa el archivo SWF o archivo de gráficos que se carga. Cuando se añade un objeto Loader a la lista de visualización, como en el código siguiente, también se añade a la lista de visualización el objeto de visualización secundario cargado, una vez que se ha cargado:

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

Cuando se carga el archivo SWF o la imagen, se puede mover el objeto de visualización cargado a otro contenedor de objeto de visualización, como el objeto DisplayObjectContainer container que se muestra en este ejemplo:

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

Supervisión del progreso de carga

Cuando se empieza a cargar el archivo, se crea un objeto LoaderInfo. Un objeto LoaderInfo proporciona información tal como el progreso de carga, los URL del cargador y el contenido cargado, el número total de bytes del medio, y la anchura y la altura nominal del medio. Un objeto LoaderInfo también distribuye eventos para supervisar el progreso de la carga.

El siguiente diagrama muestra los diferentes usos del objeto LoaderInfo para la instancia de la clase principal del archivo SWF, para un objeto Loader y para un objeto cargado por el objeto Loader:

Se puede acceder al objeto LoaderInfo como una propiedad tanto del objeto Loader como del objeto de visualización cargado. En cuanto comienza la carga, se puede acceder al objeto LoaderInfo a través de la propiedad contentLoaderInfo del objeto Loader. Cuando finaliza la carga del objeto de visualización, también es posible acceder al objeto LoaderInfo como una propiedad del objeto de visualización cargado, a través de la propiedad loaderInfo del objeto de visualización. La propiedad loaderInfo del objeto de visualización hace referencia al mismo objeto LoaderInfo al que se refiere la propiedad contentLoaderInfo del objeto Loader. Dicho de otro modo, un objeto LoaderInfo se comparte entre un objeto cargado y el objeto Loader que lo ha cargado (es decir, entre el contenido cargado y el cargador).

Para acceder a las propiedades del contenido cargado, es necesario añadir un detector de eventos al objeto LoaderInfo, como se muestra en el siguiente código:

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

Para obtener más información, consulte Gestión de eventos.

Especificación del contexto de carga

Cuando se carga un archivo externo en Flash Player o AIR con el método load() o loadBytes(), se puede especificar opcionalmente un parámetro context. Este parámetro es un objeto LoaderContext.

La clase LoaderContext incluye tres propiedades que permiten definir el contexto de uso del contenido cargado:

  • checkPolicyFile: utilice esta propiedad solo si carga un archivo de imagen (no un archivo SWF). Si establece esta propiedad en true, Loader comprueba el servidor de origen de un archivo de política (consulte Controles de sitio web (archivos de política)). Solo es necesaria en el contenido procedente de dominios ajenos al del archivo SWF que contiene el objeto Loader. Si el servidor concede permisos al dominio de Loader, el código ActionScript de los archivos SWF del dominio de Loader puede acceder a los datos de la imagen cargada y, por lo tanto, se puede usar el comando BitmapData.draw() para acceder a los datos de la imagen cargada.

    Tenga en cuenta que un archivo SWF de otros dominios ajenos al del objeto Loader puede llamar a Security.allowDomain() para permitir el uso de un dominio específico.

  • securityDomain: utilice esta propiedad solo si carga un archivo SWF (no una imagen). Esta propiedad se especifica en un archivo SWF de un dominio ajeno al del archivo que contiene el objeto Loader. Si se especifica esta opción, Flash Player comprueba la existencia de un archivo de política y, en caso de que exista uno, los archivos SWF de los dominios permitidos en el archivo de política entre dominios pueden reutilizar los scripts del contenido SWF cargado. Se puede especificar flash.system.SecurityDomain.currentDomain como este parámetro.

  • applicationDomain: utilice esta propiedad solamente si carga un archivo SWF escrito en ActionScript 3.0 (no una imagen ni un archivo SWF escritos en ActionScript 1.0 o 2.0). Al cargar el archivo, se puede especificar que se incluya en el mismo dominio de aplicación del objeto Loader; para ello, hay que establecer el parámetro applicationDomain en flash.system.ApplicationDomain.currentDomain. Al colocar el archivo SWF cargado en el mismo dominio de aplicación, se puede acceder a sus clases directamente. Esto puede ser muy útil si se carga un archivo SWF que contiene medios incorporados, a los que se puede tener acceso a través de sus nombres de clase asociados. Para obtener más información, consulte Trabajo con dominios de aplicación.

A continuación se muestra un ejemplo de comprobación de un archivo de política durante la carga de un mapa de bits de otro dominio:

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

A continuación se muestra un ejemplo de comprobación de un archivo de política durante la carga de un archivo SWF de otro dominio, con el fin de colocar el archivo en el mismo entorno limitado de seguridad que el objeto Loader. Además, el código añade las clases del archivo SWF cargado al mismo dominio de aplicación que el del objeto Loader:

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

Para obtener más información, consulte la clase LoaderContext en Referencia de ActionScript 3.0 para la plataforma de Adobe Flash.

Carga de archivos SWF en AIR para iOS

Con dispositivos iOS, hay restricciones de carga y compilación en tiempo de ejecución. Dichas restricciones implican ciertas diferencias en la tarea de carga de archivos SWF externos en la aplicación:

  • Todos los archivos SWF que contienen código ActionScript deben incluirse en el paquete de la aplicación. No es posible cargar desde un origen externo archivos SWF que contengan código. Como parte del empaquetado de la aplicación, se compila el código ActionScript de todos los archivos SWF en el paquete de la aplicación como código nativo para dispositivos iOS.

  • No puede cargar, descargar y volver a cargar un archivo SWF. Si lo intenta, se producirá un error.

  • La carga en memoria y posterior descarga se realiza igual que en plataformas de escritorio. Al cargar un archivo SWF y luego descargarlo, todos los elementos visuales que contenga se descargan de la memoria. Pero no es el caso de las referencias de clase de ActionScript que pueda haber en el SWF cargado, que se mantienen en la memoria y son accesible en el código ActionScript.

  • Todos los archivos SWF cargados deben cargarse en el mismo dominio de aplicación que el SWF principal. Dado que este comportamiento no es el predeterminado, por cada archivo SWF que cargue debe crear un objeto LoaderContext especificando el dominio de aplicación principal y pasar el objeto LoaderContext a la llamada a método Loader.load(). Si intenta cargar un SWF en un dominio de aplicación que no sea el de la aplicación de SWF principal, se producirá un error. Esto ocurre incluso si el SWF cargado contiene únicamente elementos visuales (sin código ActionScript).

    En el ejemplo siguiente se muestra el código que usar para cargar un archivo SWF del paquete de la aplicación en el dominio de la aplicación de SWF principal:

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

Si un archivo SWF contiene únicamente elementos (no código), se puede cargar desde el paquete de la aplicación o a través de una red. En ambos casos es preciso cargar el SWF en el dominio de la aplicación principal.

Para versiones de AIR anteriores a AIR 3.6, durante el proceso de compilación se quita el código de todos los archivos SWF a excepción del de la aplicación principal. En tiempo de ejecución se pueden incluir en el paquete de la aplicación archivos SWF que contengan elementos visuales pero no código. Si intenta cargar un SWF con código ActionScript, se producirá un error. De ser así aparecerá en la aplicación un cuadro de diálogo de ActionScript sin compilar.

Véase también

Packaging and loading multiple SWFs in AIR apps on iOS

Uso de las clases ProLoader y ProLoaderInfo

Para ayudar con la precarga de la biblioteca remota compartida (RSL), Flash Professional CS5.5 introduce las clases fl.display.ProLoader y fl.display.ProLoaderInfo. Estas clases imitan a las clases flash.display.Loader y flash.display.LoaderInfo pero presentan un comportamiento de carga más coherente.

En concreto, ProLoader ayuda a cargar archivos SWF que utilizan Text Layout Framework (TLF) con precarga de RSL. En tiempo de ejecución, los archivos SWF que precargan otros archivos SWF o SWZ como, por ejemplo, TLF, requieren un archivo envolvente SWF solo interno. La capa adicional de complejidad impuesta por el archivo envolvente SWF puede tener un comportamiento no deseado. ProLoader soluciona esta complejidad para cargar estos archivos como si fueran archivos normales SWF. La solución utilizada por la clase ProLoader es transparente para el usuario y no requiere un control especial en ActionScript. Asimismo, ProLoader carga el contenido SWF normal correctamente.

En Flash Professional CS5.5 y posterior, puede reemplazar con seguridad todos los usos de la clase Loader con la clase ProLoader. A continuación, exporte su aplicación a Flash Player 10.2 o posterior para que ProLoader pueda acceder a la funcionalidad de ActionScript necesaria. También puede utilizar ProLoader mientras se utilizan versiones anteriores de Flash Player que admiten ActionScript 3.0. Sin embargo, se aprovechan completamente las funciones de ProLoader solo con Flash Player 10.2 o superior. Utilice siempre ProLoader cuando use TLF en Flash Professional CS5.5 o posterior. ProLoader no es necesario en entornos distintos a Flash Professional.

Importante: para los archivos SWF publicados en Flash Professional CS5.5 y posterior, utilice siempre las clases fl.display.ProLoader y fl.display.ProLoaderInfo en lugar de flash.display.Loader y flash.display.LoaderInfo.

Problemas abordados por la clase ProLoader

La clase ProLoader aborda problemas para los que la clase heredada Loader no estaba diseñada para gestionar. Estos problemas proceden de la precarga RSL de bibliotecas TLF. Concretamente, se aplican a los archivos SWF que utilizan un objeto Loader para cargar otros archivos SWF. Entre los problemas tratados se incluyen los siguientes:

  • La creación de scripts entre el archivo de carga y el archivo cargado no se comporta como estaba previsto. La clase ProLoader establece automáticamente el archivo SWF en carga como elemento principal del archivo SWF cargado. De este modo, las comunicaciones del archivo SWF de carga van directamente al archivo SWF cargado.

  • La aplicación SWF debe gestionar activamente el proceso de carga. Esto requiere la implementación de eventos adicionales como, por ejemplo, added, removed, addedToStage y removedFromStage. Si la aplicación se destina a Flash Player 10.2 o posterior, ProLoader elimina la necesidad de este trabajo adicional.

Actualización de código para utilizar con ProLoader en lugar de Loader

Como ProLoader imita a la clase Loader, es posible alternar fácilmente entre las dos clases en el código. El siguiente ejemplo muestra cómo actualizar el código existente para utilizar la nueva clase:

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

Este código se puede actualizar para usar ProLoader del modo siguiente:

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