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

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

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

  • SWF-файл, разработанный в ActionScript 3.0 — этот файл может относиться к классу Sprite, MovieClip или любому классу, являющемуся расширением Sprite. В приложениях AIR в ОС iOS можно загружать только SWF-файлы, не содержащие байт-код ActionScript. Это означает, что можно загрузить SWF-файлы, содержащие внедренные данные, такие как изображения и звук, но нельзя загрузить SWF-файлы, содержащие исполняемый код.

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

  • Файл AVM1 SWF — это SWF-файл, созданный на языке ActionScript 1.0 или 2.0. (не поддерживается в приложениях AIR для мобильных устройств)

Загрузка этих активов производится с помощью класса 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.

Загрузка SWF-файлов в среде AIR для iOS

На устройствах под управлением iOS имеются ограничения на загрузку и компиляцию кода во время выполнения. Из-за этих ограничений возникают следующие сложности при загрузке внешних SWF-файлов в приложение.

  • Все SWF-файлы, содержащие код ActionScript, должны входить в пакет приложения. Загрузка SWF с кодом из внешнего ресурса (например, по сети) невозможна. При создании пакета приложения весь код ActionScript в SWF-файлах пакета компилируется в собственный код устройств iOS.

  • Загрузка, выгрузка и повторная загрузка SWF-файла невозможна. При попытке выполнить эти действия возникнет ошибка.

  • Поведение среды при загрузке в память и выгрузке из нее не отличается от поведения настольных платформ. После выгрузки загруженного SWF-файла все визуальные ресурсы, содержащиеся в нем, будут выгружены из памяти. Однако все ссылки на классы ActionScript из загруженного SWF-файла останутся в памяти и могут быть использованы кодом ActionScript.

  • Все загружаемые SWF-файлы должны быть загружены в том же домене приложения, что и основной SWF-файл. По умолчанию такого не происходит, поэтому для каждого загружаемого SWF-файла следует создавать объект LoaderContext с указанием на основной домен приложения и передавать этот объект LoaderContext при вызове метода Loader.load(). При попытке загрузить SWF-файл в домен приложения, отличный от домена приложения основного SWF-файла, возникает ошибка. Это правило также выполняется, если загружаемый SWF-файл содержит только визуальные ресурсы и не содержит кода ActionScript.

    В следующем примере показан код, которым осуществляется загрузка SWF-файла из пакета приложения в домен приложения основного SWF-файла.

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

SWF-файл, содержащий только ресурсы без кода, может быть загружен как из пакета приложения, так и по сети. В обоих случаях этот SWF-файл так же необходимо загружать в основной домен приложения.

Если среда AIR имеет более раннюю версию, чем AIR 3.6, в процессе компиляции игнорируется весь код во всех SWF-файлах, кроме основного файла приложения. В пакет приложения для загрузки во время выполнения можно включать только SWF-Файлы, содержащие визуальные ресурсы и не содержащие код. При попытке загрузить SWF-файл, содержащий код ActionScript, возникнет ошибка. Эта ошибка приведет к появлению в приложении диалогового окна Uncompiled ActionScript (Нескомпилированный ActionScript).

См. также

Включение в пакет и загрузка несколькихSWF-файлов в приложениях AIR на iOS

Использование классов ProLoader и ProLoaderInfo

В среде Flash Professional CS5.5 представлены новые классы fl.display.ProLoader и fl.display.ProLoaderInfo, помогающие выполнить предварительную загрузку удаленной общей библиотеки (RSL). Эти классы зеркально воспроизводят классы flash.display.Loader и flash.display.LoaderInfo, но обеспечивают более последовательное взаимодействие при загрузке.

В частности, ProLoader помогает загрузить файлы SWF, использующие Text Layout Framework (TLF) с предварительной загрузкой RSL. Во время выполнения файлам SWF, предварительно загружающим другие файлы SWF или SWZ, например TLF, требуется только внутренний файл оболочки SWF. Дополнительный уровень сложности, связанный с использованием файла оболочки SWF, может привести к нежелательному поведению. ProLoader позволяет решить проблемы, связанные с загрузкой этих файлов, загружая их как обычные файлы SWF. Решение, используемое классом ProLoader, является прозрачным для пользователей и не требует специальной обработки в среде ActionScript. Помимо этого, класс ProLoader правильно загружает обычное содержимое SWF.

В среде Flash Professional CS5.5 и более поздних версий можно без последствий заменить все используемые экземпляры класса Loader классом ProLoader. Затем необходимо экспортировать программу в среду Flash Player 10.2 или более поздней версии, чтобы класс ProLoader мог получать доступ к необходимым функциям ActionScript. Класс ProLoader также можно использовать при разработке приложений для более ранних версий Flash Player, поддерживающих ActionScript 3.0. Однако полный функциональный набор класса ProLoader доступен только в среде Flash Player 10.2 или более поздних версий. Всегда используйте класс ProLoader вместе с TLF в среде Flash Professional CS5.5 или более поздних версий. Класс ProLoader не требуется в средах, отличных от Flash Professional.

Важная информация. Для файлов SWF, опубликованных во Flash Professional CS5.5 и более поздних версий, всегда можно использовать классы fl.display.ProLoader и fl.display.ProLoaderInfo вместо классов flash.display.Loader и flash.display.LoaderInfo.

Проблемы, которые решает класс ProLoader

Класс ProLoader решает проблемы, обработка которых не предусмотрена существующим классом Loader. Эти проблемы возникают в связи с предварительной загрузкой RSL библиотек TLF. В частности, они относятся к файлам SWF, использующим объект Loader для загрузки других файлов SWF. В числе решаемых проблем:

  • Сценарии между загружающим файлом и загруженным файлом не выполняются надлежащим образом. Класс ProLoader автоматически задает загружающий SWF-файл в качестве родительского элемента загружаемого SWF-файла. В результате сообщения из загружающего файла SWF передаются непосредственно в загруженный файл SWF.

  • Программа SWF должна активно управлять процессом загрузки. Для этого требуется реализация дополнительных событий, таких как added, removed, addedToStage и removedFromStage. Если приложение предназначено для проигрывателя Flash Player 10.2 или более поздних версий, класс ProLoader исключает необходимость выполнения дополнительной работы.

Обновление кода для использования класса ProLoader вместо класса Loader

Поскольку класс ProLoader является зеркальным повторением класса Loader, можно без труда поочередно использовать в коде эти два класса. Следующий пример демонстрирует обновление существующего кода для использования нового класса.

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

Этот код можно обновить для использования класса ProLoader следующим образом:

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