표시 내용을 동적으로 로드
Flash Player 9 이상, Adobe AIR 1.0 이상
다음과 같은 외부 표시 에셋을 ActionScript 3.0 응용 프로그램으로 로드할 수 있습니다.
-
ActionScript 3.0에서 제작된 SWF 파일 - 이 파일은 Sprite 또는 MovieClip 클래스이거나 Sprite를 확장하는 모든 클래스가 될 수 있습니다. iOS의 AIR 응용 프로그램에서는 ActionScript 바이트코드가 포함되지 않은 SWF 파일만 로드할 수 있습니다. 따라서 이미지 및 사운드 같은 포함된 데이터가 들어 있는 SWF 파일은 로드할 수 있지만 실행 코드가 들어 있는 SWF 파일은 로드할 수 없습니다.
-
이미지 파일 - JPG, PNG 및 GIF 파일을 포함합니다.
-
AVM1 SWF 파일 - ActionScript 1.0 또는 2.0에서 작성된 SWF 파일입니다. 모바일 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 객체와 로드된 표시 객체 모두의 속성으로 액세스할 수 있습니다. 로드가 시작되면 Loader 객체의
contentLoaderInfo
속성을 통해 LoaderInfo 객체에 즉시 액세스할 수 있습니다. 표시 객체에서 로드가 완료된 경우 표시 객체의
loaderInfo
속성을 통해 LoaderInfo 객체를 로드된 표시 객체의 속성으로 액세스할 수도 있습니다. 로드된 표시 객체의
loaderInfo
속성은 Loader 객체의
contentLoaderInfo
속성과 동일한 LoaderInfo 객체를 나타냅니다. 즉, 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;
}
자세한 내용은
이벤트 처리
를 참조하십시오.
로드 컨텍스트 지정
Loader 클래스의
load()
또는
loadBytes()
메서드를 통해 외부 파일을 Flash Player 또는 AIR로 로드할 때
context
매개 변수를 선택적으로 지정할 수 있습니다. 이 매개 변수는 LoaderContext 객체입니다.
LoaderContext 클래스에는 로드된 내용을 사용하는 방법에 대한 컨텍스트를 정의할 수 있는 세 가지 속성이 포함되어 있습니다.
-
checkPolicyFile
: 이 속성은 SWF 파일이 아닌 이미지 파일을 로드할 때만 사용합니다. 이 속성을
true
로 설정하면 Loader는 원래 서버에서 정책 파일을 확인합니다(
웹 사이트 컨트롤(정책 파일)
참조). 이러한 설정은 Loader 객체를 포함하는 SWF 파일의 도메인과 다른 도메인에서의 내용에 대해서만 필요합니다. 서버에서 Loader 도메인에 권한을 부여하면 Loader 도메인에 있는 SWF 파일의 ActionScript는 로드된 이미지에서 데이터를 액세스할 수 있습니다. 즉,
BitmapData.draw()
명령을 사용하여 로드된 이미지에서 데이터를 액세스할 수 있습니다.
Loader 객체의 도메인과 다른 도메인에서의 SWF 파일은
Security.allowDomain()
을 호출하여 특정 도메인을 허용할 수 있습니다.
-
securityDomain
: 이 속성은 이미지가 아닌 SWF 파일을 로드할 때만 사용합니다. Loader 객체를 포함하는 파일의 도메인과 다른 도메인에서의 SWF 파일에 대해 이 속성을 지정합니다. 이 옵션을 지정하면 Flash Player에서는 정책 파일이 있는지 확인합니다. 이 파일이 있는 경우 크로스 정책 파일에 허용된 도메인에서의 SWF 파일은 로드된 SWF 내용을 크로스 스크립팅할 수 있습니다.
flash.system.SecurityDomain.currentDomain
을 이 매개 변수로 지정할 수 있습니다.
-
applicationDomain
: 이 속성은 ActionScript 3.0으로 작성된 SWF 파일을 로드할 때만 사용합니다. 이미지 파일이나 ActionScript 1.0 또는 2.0으로 작성된 SWF 파일은 해당하지 않습니다. 파일을 로드할 때
applicationDomain
매개 변수를
flash.system.ApplicationDomain.currentDomain
으로 설정하여 Loader 객체와 동일한 응용 프로그램 도메인에 파일을 포함시키도록 지정할 수 있습니다. 로드된 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);
다음은 파일을 Loader 객체와 동일한 보안 샌드박스에 저장하기 위해 다른 도메인에서 SWF를 로드할 때 정책 파일을 확인하는 예제입니다. 이 코드는 로드된 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);
자세한 내용은
Adobe Flash Platform용 ActionScript 3.0 참조 설명서
에서
LoaderContext
클래스를 참조하십시오.
AIR for iOS의 SWF 파일 로드
iOS 장치에서는 런타임에 코드를 로드하고 컴파일하는 데 제약이 있습니다. 이 제약 때문에 외부 SWF 파일을 응용 프로그램에 로드하는 작업이 약간 다를 수밖에 없습니다.
-
ActionScript 코드가 포함된 모든 SWF 파일은 응용 프로그램 패키지에 포함되어야 합니다. 코드가 포함된 SWF는 네트워크 등의 외부 소스로부터 로드할 수 없습니다. 응용 프로그램을 패키지화할 때 응용 프로그램 패키지에 포함된 모든 SWF 파일의 ActionScript 코드가 iOS 장치용 기본 코드로 컴파일됩니다.
-
SWF 파일을 로드하고 언로드했다가 다시 로드할 수는 없습니다. 이렇게 하려고 하면 오류가 발생합니다.
-
메모리에 로드한 다음 언로드하는 동작은 데스크톱 플랫폼에서와 동일합니다. SWF 파일을 로드했다가 언로드하면 SWF에 포함된 모든 시각적 에셋이 메모리에서 언로드됩니다. 하지만 로드된 SWF의 ActionScript 클래스에 대한 클래스 참조는 메모리에 그대로 유지되며 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 3.6 이전의 AIR 버전에서는 모든 코드가 컴파일 과정에서 기본 응용 프로그램 SWF 이외의 모든 SWF에서 제거됩니다. 시각적 에셋만 있는 SWF 파일은 런타임 시 응용 프로그램 패키지에 포함하고 로드할 수 있지만 코드는 그렇지 않습니다. ActionScript 코드가 포함된 SWF를 로드하려 하면 오류가 발생합니다. 이 오류로 인해 응용 프로그램에 "컴파일되지 않은 ActionScript"라는 오류 대화 상자가 나타납니다.
참고 사항
iOS의 AIR 응용 프로그램에서의 여러 SWF 패키지화 및 로드
ProLoader 및 ProLoaderInfo 클래스 사용
Flash Professional CS5.5에는 RSL(런타임 공유 라이브러리) 미리 로드를 지원하기 위해 fl.display.ProLoader 및 fl.display.ProLoaderInfo 클래스가 도입되었습니다. 이러한 클래스는 flash.display.Loader 및 flash.display.LoaderInfo 클래스를 미러링하지만 로딩 환경의 일관성이 더 뛰어납니다.
특히, ProLoader는 TLF(Text Layout Framework)과 RSL 미리 로드를 함께 사용하는 SWF 파일을 로드하는 데 도움이 됩니다. 다른 SWF 파일 또는 SWZ 파일(예: TLF)을 미리 로드하는 SWF 파일을 런타임에 사용하려면 내부 전용 SWF 래퍼 파일이 있어야 합니다. SWF 래퍼 파일로 인해 레이어가 추가로 복잡해지면 원치 않는 비헤이비어가 발생할 수 있는데, ProLoader는 이러한 복잡성을 해결하여 이들 파일을 일반적인 SWF 파일인 것처럼 로드합니다. ProLoader 클래스에서 사용되는 솔루션은 사용자에게 투명한 방식으로 실행되며, 솔루션을 사용하기 위해 ActionScript에서 특별히 처리할 필요가 없습니다. 또한 ProLoader는 일반적인 SWF 내용을 올바르게 로드합니다.
Flash Professional CS 5.5 이상에서는 모든 Loader 클래스를 대신하여 ProLoader 클래스를 사용해도 무방합니다. 그런 다음에는 ProLoader가 필요한 ActionScript 기능에 액세스할 수 있도록 응용 프로그램을 Flash Player 10.2 이상으로 내보냅니다. ActionScript 3.0을 지원하는 이전 버전의 Flash Player를 대상으로 지정하는 경우에도 ProLoader를 사용할 수 있지만, ProLoader의 기능을 최대한 활용하려면 Flash Player 10.2 이상과 함께 사용해야 합니다. Flash Professional CS5.5 이상에서 TLF를 사용할 경우 항상 ProLoader를 사용하십시오. Flash Professional 이외의 환경에서는 ProLoader를 사용할 필요가 없습니다.
중요:
Flash Professional CS5.5 이상에서 제작된 SWF 파일의 경우에는 flash.display.Loader 및 flash.display.LoaderInfo 대신 항상 fl.display.ProLoader 및 fl.display.ProLoaderInfo 클래스를 사용해도 됩니다.
ProLoader 클래스를 통해 해결되는 문제
ProLoader 클래스는 기존 Loader 클래스로 처리하지 못하는 문제를 해결합니다. 이러한 문제는 TLF 라이브러리의 RSL 미리 로드로 인해 발생하며, 특히 Loader 객체를 사용하여 다른 SWF 파일을 로드하는 SWF 파일에 적용됩니다. 해결되는 문제는 다음과 같습니다.
-
로드하는 파일과 로드되는 파일 간의 스크립팅이 예상대로 작동하지 않습니다.
ProLoader 클래스는 로드하는 SWF 파일을 로드되는 SWF 파일의 부모로 자동 설정합니다. 따라서 로드하는 SWF 파일의 통신 내용이 로드되는 SWF 파일로 직접 전달됩니다.
-
SWF 응용 프로그램이 로드 프로세스를 관리해야 합니다.
이렇게 하려면
added
,
removed
,
addedToStage
및
removedFromStage
같은 추가 이벤트를 구현해야 합니다. 응용 프로그램이 Flash Player 10.2 이상을 대상으로 하는 경우 ProLoader는 이러한 추가 작업을 수행할 필요가 없도록 합니다.
Loader 대신 ProLoader를 사용하기 위한 코드 업데이트
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!');
}
|
|
|
|
|