Chargement dynamique du contenu d’affichage

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les éléments d’affichage externes suivants peuvent être chargés dans une application ActionScript 3.0 :

  • Fichier SWF programmé dans ActionScript 3.0 : ce fichier peut correspondre à Sprite, MovieClip ou toute classe qui étend Sprite. Dans les applications AIR sous iOS, seuls les fichiers SWF qui ne contiennent pas de code d’octet ActionScript peuvent être chargés. En d’autres termes, les fichiers SWF qui contiennent des données incorporées, telles qu’images et son, peuvent être chargées, mais pas les fichiers SWF contenant du code exécutable.

  • Fichier d’image : tels que les fichiers JPG, PNG et GIF.

  • Fichier AVM1 SWF : fichier SWF écrit en ActionScript 1.0 ou 2.0. (non pris en charge sur les applications mobiles AIR)

Vous chargez ces ressources par le biais de la classe Loader.

Chargement d’objets d’affichage

Les objets Loader permettent de charger des fichiers SWF et des fichiers graphiques dans une application. La classe Loader est une sous-classe de la classe DisplayObjectContainer. La liste d’affichage d’un objet Loader ne comporte qu’un seul objet d’affichage enfant : l’objet d’affichage qui représente le fichier SWF ou graphique qu’il charge. Lorsque vous ajoutez un objet Loader à la liste d’affichage, comme dans le code ci-dessous, vous ajoutez également l’objet d’affichage enfant chargé à la liste d’affichage, une fois le chargement effectué :

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

Lorsque le fichier SWF ou l’image sont chargés, vous pouvez transférer l’objet d’affichage chargé dans un autre conteneur d’objets d’affichage, tel que l’objet container de la classe DisplayObjectContainer dans l’exemple illustré :

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

Surveillance de la progression du chargement

Lorsque le chargement du fichier débute, un objet LoaderInfo est créé. Un objet LoaderInfo fournit diverses informations sur le chargement : progression, adresses URL du chargeur et du chargé, nombre d’octets total de l’objet multimédia et dimensions nominales (hauteur et largeur) de celui-ci. Par ailleurs, un objet LoaderInfo distribue les événements qui permettent de suivre la progression du chargement.

Le diagramme suivant présente les diverses utilisations de l’objet LoaderInfo, pour l’occurrence de la classe principale du fichier SWF, pour un objet Loader et pour un objet chargé par ce dernier :

Vous pouvez accéder à l’objet LoaderInfo en tant que propriété de l’objet Loader et de l’objet d’affichage chargé. Dès que le chargement débute, vous pouvez accéder à l’objet LoaderInfo par le biais de la propriété contentLoaderInfo de l’objet Loader. Lorsque le chargement de l’objet d’affichage est terminé, vous pouvez également accéder à l’objet LoaderInfo en tant que propriété de cet objet chargé par le biais de la propriété loaderInfo de l’objet d’affichage. La propriété loaderInfo de l’objet d’affichage chargé se réfère au même objet LoaderInfo que la propriété contentLoaderInfo de l’objet Loader. En d’autres termes, un objet LoaderInfo est partagé entre un objet chargé et l’objet Loader qui l’a chargé (entre le chargeur et le chargé).

Pour accéder aux propriétés du contenu chargé, il est recommandé d’ajouter un écouteur d’événement à l’objet LoaderInfo, comme indiqué dans le code suivant :

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

Pour plus d’informations, voir Gestion des événements.

Définition du contexte de chargement

Lorsque vous chargez un fichier externe dans Flash Player ou AIR par le biais de la méthode load() ou loadBytes() de la classe Loader, vous pouvez indiquer le paramètre context. Ce paramètre est un objet LoaderContext.

La classe LoaderContext comporte trois propriétés qui permettent de définir le contexte d’utilisation du contenu chargé :

  • checkPolicyFile : utilisez cette propriété uniquement pour le chargement d’un fichier image (pas pour un fichier SWF). Si vous définissez cette propriété sur true, l’objet Loader vérifie si le serveur d’origine héberge un fichier de régulation (voir Contrôles de site Web (fichiers de régulation)). Cette opération n’est requise que si le contenu émane de domaines autres que celui du fichier SWF qui contient l’objet Loader. Si le serveur accorde une autorisation au domaine de Loader, le code ActionScript extrait des fichiers SWF du domaine de Loader peut accéder aux données de l’image chargée. En d’autres termes, vous pouvez utiliser la commande BitmapData.draw() pour accéder aux données de l’image chargées.

    Notez qu’un fichier SWF extrait d’un autre domaine que celui de l’objet Loader peut appeler Security.allowDomain() pour autoriser un domaine déterminé.

  • securityDomain : utilisez cette propriété uniquement pour le chargement d’un fichier SWF (pas pour une image). Cette propriété peut être appelée pour un fichier SWF provenant d’un autre domaine que celui du fichier qui contient l’objet Loader. Lorsque vous indiquez cette option, Flash Player vérifie l’existence d’un fichier de régulation et, s’il existe, les fichiers SWF des domaines autorisés dans ce fichier peuvent utiliser des opérations de programmation croisée avec le contenu du fichier SWF chargé. Vous pouvez stipuler flash.system.SecurityDomain.currentDomain en tant que paramètre.

  • applicationDomain : utilisez cette propriété uniquement lors du chargement d’un fichier SWF écrit dans ActionScript 3.0 (et non une image ou un fichier SWF écrit dans ActionScript 1.0 ou 2.0). Lorsque vous chargez un fichier, vous devez indiquer que le fichier doit être inclus dans le même domaine d’application que l’objet Loader en attribuant au paramètre applicationDomain la valeur flash.system.ApplicationDomain.currentDomain. Si vous placez le fichier SWF chargé dans le même domaine d’application, vous pourrez accéder directement à ses classes, ce qui s’avère utile si vous chargez un fichier SWF contenant des média intégrés, auxquels vous pouvez accéder via les noms de classes associés. Pour plus d’informations, voir Utilisation de domaines d’application.

Exemple de vérification d’un fichier de régulation lors du chargement d’une image bitmap provenant d’un autre domaine :

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

Exemple de vérification d’un fichier de régulation lors du chargement d’un fichier SWF à partir d’un autre domaine, dans le but de placer ce fichier dans la même Sandbox de sécurité que l’objet Loader. Par ailleurs, le code ajoute les classes du fichier SWF chargé dans le même domaine d’application que celui de l’objet 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);

Pour plus d’informations, voir la classe LoaderContext dans le manuel Guide de référence ActionScript 3.0 pour la plate-forme Adobe Flash.

Chargement de fichiers SWF dans AIR pour iOS

Il existe des restrictions concernant le chargement et la compilation de code à l’exécution sur les périphériques iOS. En raison de ces restrictions, vous constaterez certaines différences nécessaires dans la tâche de chargement des fichiers SWF externes dans votre application :

  • Tous les fichiers contenant du code ActionScript doivent être inclus dans le package d’application. Aucun fichier SWF contenant du code ne peut être chargé depuis une source externe (via un réseau, par exemple). Lors de la création du package de l’application, le code ActionScript des fichiers SWF du package d’application est compilé en code natif pour périphériques iOS.

  • Il est impossible de charger, décharger, puis recharger un fichier SWF. Si vous tentez de le faire, une erreur se produit.

  • Le comportement en cas de chargement en mémoire, puis de déchargement, est le même qu’avec les systèmes d’exploitation d’ordinateur de bureau. Si vous chargez un fichier SWF, puis que vous le déchargez, tous les éléments visuels contenus dans le SWF sont déchargés de la mémoire. Toutefois, les références de classe à une classe ActionScript dans le fichier SWF chargé restent en mémoire et sont accessibles par le code ActionScript.

  • Tous les fichiers SWF doivent être chargés dans le même domaine d’application que le fichier SWF principal. Ceci n’est pas le comportement par défaut. C’est pourquoi, pour chaque SWF chargé, vous devez créer un objet LoaderContext spécifiant le domaine d’application principal et transmettre cet objet LoaderContext à l’appel de méthode Loader.load(). Si vous tentez de charger un fichier SWF dans un domaine d’application autre que le domaine d’application SWF principal, une erreur se produit. Cela est vrai même si le fichier SWF chargé ne contient que des éléments visuels sans code ActionScript.

    L’exemple suivant montre le code à utiliser pour charger le SWF depuis le package d’application dans le domaine d’application du fichier 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);

Un fichier SWF contenant uniquement des actifs sans code peut être chargé depuis le package d’application ou via réseau. Dans les deux cas, le fichier SWF doit toujours être chargé dans le domaine d’application principal.

Pour les versions d’AIR antérieures à 3.6, le code est retiré de tous les fichiers SWF, à l’exception du fichier d’application SWF principal, au cours du processus de compilation. Les fichiers SWF ne contenant que des éléments visuels peuvent être inclus dans le package d’application et chargés à l’exécution, mais pas le code. Si vous tentez de charger un fichier SWF contenant du code ActionScript, une erreur se produit. Cette erreur cause l’apparition d’un message d’erreur « ActionScript non compilé » dans l’application.

Voir aussi

Packaging and loading multiple SWFs in AIR apps on iOS (disponible en anglais uniquement).

Utilisation des classes ProLoader et ProLoaderInfo

Pour faciliter le préchargement de la bibliothèque RSL (Remote Shared Library), Flash Professional CS5.5 intègre à présent les classes fl.display.ProLoader et fl.display.ProLoaderInfo. Ces classes reflètent les classes flash.display.Loader et flash.display.LoaderInfo, mais assurent un chargement plus cohérent.

La classe ProLoader permet en particulier de charger les fichiers SWF qui font appel à Text Layout Framework (TLF) lors d’un préchargement RSL. A l’exécution, les fichiers SWF qui préchargent d’autres fichiers SWF ou des fichiers SWZ, tels que TLF, nécessitent un fichier d’enveloppe SWF à usage interne uniquement. Cette couche complémentaire de complexité imposée par le fichier d’enveloppe SWF entraîne parfois un comportement inattendu. La classe ProLoader résout ce problème en permettant de charger les fichiers comme des fichiers SWF standard. La solution adoptée par la classe ProLoader est transparente du point de vue de l’utilisateur et ne requiert pas de traitement particulier dans ActionScript. La classe ProLoader charge par ailleurs correctement les contenus SWF standard.

Dans Flash Professional CS 5.5 et ultérieur, vous pouvez remplacer la classe Loader par la classe ProLoader dans tous les cas de figure en toute sécurité. Exportez ensuite l’application vers Flash Player 10.2 ou ultérieur, afin que la classe ProLoader puisse accéder à la fonctionnalité ActionScript requise. Vous pouvez également faire appel à la classe ProLoader si vous ciblez des versions antérieures de Flash Player qui prennent en charge ActionScript 3.0. Toutefois, seul Flash Player 10.2 ou ultérieur exploite pleinement les fonctions de Proloader. Utilisez toujours la classe ProLoader si vous faites appel à TLF dans Flash Professional CS5.5 ou ultérieur. L’utilisation de ProLoader est superflue dans les environnements autres que Flash Professional.

Important : pour les fichiers SWF publiés dans Flash Professional CS5.5 et ultérieur, il est toujours possible d’utiliser les classes fl.display.ProLoader et fl.display.ProLoaderInfo au lieu des classes flash.display.Loader et flash.display.LoaderInfo.

Problèmes résolus par la classe ProLoader

La classe ProLoader résout les problèmes que la classe Loader existante, de par sa conception, ne prenait pas en charge. Ces problèmes résultent du préchargement RSL de bibliothèques TLF. Ils concernent spécifiquement les fichiers SWF qui chargent d’autres fichiers SWF par le biais d’un objet Loader. Les problèmes résolus sont les suivants :

  • L’utilisation de scripts entre le fichier de chargement et le fichier chargé entraîne des résultats inattendus. La classe ProLoader définit automatiquement le fichier SWF de chargement en tant que parent du fichier SWF chargé. De ce fait, les communications émanant du fichier SWF de chargement ciblent directement le fichier SWF chargé.

  • L’application SWF doit gérer activement le processus de chargement. Cette opération requiert la mise en œuvre d’événements supplémentaires tels que added, removed, addedToStage et removedFromStage. Si l’application cible Flash Player 10.2 ou ultérieur, la classe ProLoader permet d’éviter cette tâche supplémentaire.

Mise à jour du code en vue d’utiliser ProLoader au lieu de Loader

Etant donné que la classe ProLoader reflète la classe Loader, substituer une classe à l’autre dans le code ne présente aucune difficulté. L’exemple suivant illustre la mise à jour du code existant en vue d’utiliser la nouvelle classe :

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

Il est possible de mettre à jour ce code pour utiliser la classe ProLoader, comme suit :

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