Динамическая загрузка содержимого для показа

Flash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий

В приложение на языке ActionScript 3.0 можно загрузить любые внешние активы для показа:

  • SWF-файл, разработанный в ActionScript 3.0 — этот файл может относиться к классу Sprite, MovieClip или любому классу, являющемуся расширением Sprite.

  • Файл изображения — файлы в форматах JPG, PNG и GIF.

  • Файл AVM1 SWF — это SWF-файл, созданный на языке ActionScript 1.0 или 2.0.

Загрузка этих активов производится с помощью класса Loader.

Загрузка экранных объектов

Объекты Loader используются для загрузки SWF-файлов и файлов графики в приложение. Класс Loader — это подкласс класса DisplayObjectContainer. Объект Loader может содержать в своем списке отображения только один дочерний экранный объект, который представляет собой загружаемый SWF-файл или файл графики. При добавлении объекта Loader в список отображения (как в следующем коде) в него после завершения загрузки добавляется также загруженный дочерний экранный объект:

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

После загрузки SWF-файла или изображения можно переместить загруженный экранный объект в другой контейнер экранного объекта (например, в данном примере это container DisplayObjectContainer):

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

Просмотр хода загрузки

После начала загрузки файла создается объект LoaderInfo. Объект LoaderInfo предоставляет информацию о процессе загрузки, URL-адресах загружающего объекта и загружаемого содержимого, общем количестве байтов для носителя, а также номинальной высоте и ширине содержимого. Объект LoaderInfo также отправляет события, позволяющие следить за ходом загрузки.

На следующей диаграмме показаны различные применения объекта LoaderInfo (как экземпляр основного класса SWF-файла, как объект Loader и как объект, загруженный объектом Loader):

Объект LoaderInfo можно вызвать как свойство одновременно объекта Loader и загруженного экранного объекта. Как только начнется загрузка, объект LoaderInfo можно вызвать с помощью свойства contentLoaderInfo объекта Loader. По завершении загрузки экранного объекта объект LoaderInfo можно также вызвать в качестве свойства загруженного экранного объекта с помощью свойства loaderInfo экранного объекта. Свойство loaderInfo загруженного экранного объекта относится к тому же объекту LoaderInfo, что и свойство contentLoaderInfo объекта Loader. Другими словами, объект LoaderInfo совместно используется загруженным объектом и загрузившим его объектом Loader.

Чтобы вызвать свойства загруженного содержимого, необходимо добавить прослушиватель событий в объект LoaderInfo так, как это сделано в следующем коде:

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

Дополнительные сведения см. в разделе «Обработка событий».

Указание контекста загрузки

При загрузке внешнего файла в Flash Player или AIR с помощью метода load() или loadBytes() класса Loader можно при желании указать параметр context. Этот параметр является объектом LoaderContext.

Класс LoaderContext включает три свойства, которые позволяют определить контекст применения загруженного содержимого.

  • checkPolicyFile: используйте это свойство только при загрузке файла изображения (а не SWF-файла). Если этому свойству задано значение true, объект Loader проверяет наличие файла политики на исходном сервере (см. раздел Элементы управления веб-сайта (файлы политики)). Это необходимо выполнить только для содержимого, взятого из доменов, которые отличаются от домена SWF-файла, содержащего объект Loader. Если сервер дает разрешение на доступ к домену Loader, ActionScript из SWF-файлов в домене Loader может вызывать данные в загруженном изображении. Иными словами, можно использовать команду BitmapData.draw() для доступа к данным в загруженном изображении.

    Учтите, что SWF-файл из доменов, которые отличаются от домена объекта Loader, могут вызвать Security.allowDomain(), чтобы разрешить определенный домен.

  • securityDomain: используйте это свойство только при загрузке SWF-файлов (но не изображений). Его следует указывать для SWF-файла из домена, который отличается от домена файла, содержащего объект Loader. Когда указывается этот параметр, Flash Player проверяет наличие файла политики. Если он существует, SWF-файлы из доменов, разрешенных файлом междоменной политики, могут применять загруженное содержимое SWF в разных сценариях. В качестве данного параметра можно указать flash.system.SecurityDomain.currentDomain.

  • applicationDomain: используйте это свойство только при загрузке SWF-файлов, написанных на языке ActionScript 3.0 (а не изображений или SWF-файлов, написанных на ActionScript 1.0 или 2.0). При загрузке этого файла можно указать, чтобы файл был включен в тот же домен приложений, что и объект Loader, присвоив параметру applicationDomain значение flash.system.ApplicationDomain.currentDomain. Разместив загруженный SWF-файл в том же домене приложений, можно вызывать его классы напрямую. Это может оказаться полезным, если загружается SWF-файл, содержащий встроенные мультимедийные файлы, доступ к которым может осуществляться по связанным именам классов. Дополнительные сведения см. в разделе «Работа с доменами приложений».

Вот пример проверки наличия файла политики при загрузке растрового изображения из другого домена:

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

Вот пример проверки наличия файла политики при загрузке SWF-файла из другого домена в целях размещения файла в той же изолированной программной среде, что и объект Loader. Кроме того, этот код добавляет классы в загруженном SWF-файле в тот же домен приложения, что и у объекта 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);

Дополнительные сведения см. в описании класса LoaderContext в cправочнике ActionScript® 3.0 для платформы Adobe® Flash® Platform.