상세 컨텐츠

본문 제목

[AS] 플래시 as3 이미지,부드로운 스무드 이미지로드, 파일 로드 관련

ADOBE/ ActionScript

by AlrepondTech 2016. 6. 27. 16:28

본문

반응형
728x170

 

 

 

 

=================================

=================================

=================================

 

 

 

 

출처: http://blog.flashplatform.kr/201

 

BMP 이미지로드하기

 

최근에 BMP 파일을 Flex 에서 읽어다 쓸 일이 생겼습니다. 
Flex에서 이미지를 보여주는 컴포넌트인 Image 컴포넌트는 JPEG, PNG, GIF, SWF, SVG 같은 확장자만을 지원하고 BMP은 지원하고 있지 않기 때문에 BMP을 바로 넣을 수는 없습니다.(웹에서 BMP 를 쓰는 무식한 짓을 하면 안되겠죠.. ㅜㅜ 크기도 큰데 말입니다.)  JPG 파일이면 Image 컴포넌트에서 바로 읽어다 쓸 수 있을텐데 참 난감합니다.

그럼 방법이 없느냐? 아닙니다. 
어떤 멋진 분께서 BMPDecoder 를 만들어놓으셨네요! :) 이미 FlexComponent 카페에서도 공유되었던 내용입니다.

http://ntt.cc/2008/10/01/using-bmpdecoder-class-to-load-an-external-bmp-file-rle-compression-support.html


위의 블로그에 들어가보시면 간단한 사용법에 대해서 나오고 BMPDecoder 라이브러리도 보입니다. 다만 BMPDecoder.as 파일이 다운로드가 안되네요. BMPDecoder.as 파일은 '삶의 향기'라는 블로그에  간단한 예제와 함께 업로드 되어 있으니 다운받아 사용하시면 되겠습니다. 

간단하게 FP10 에서 추가된 FileReference의 load() 메소드를 이용해, BMP파일을 불러다  Image 컴포넌트에 넣는 예제를 만들어봤습니다.  예제 구성은 위에서 소개해드린 '삶의 향기' 블로그에 소개된 코드를 이용했습니다.

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="{init()}"   
  3.     backgroundGradientAlphas="[1.0, 1.0]" backgroundGradientColors="[#FFFFFF, #FFFFFF]">  
  4.     <mx:Script>  
  5.         <![CDATA[  
  6.             import mcmall.core.codec.BMPDecoder;  
  7.             private var fileRef:FileReference;  
  8.             private function init():void  
  9.             {  
  10.                 fileRef = new FileReference();  
  11.                 fileRef.addEventListener(Event.COMPLETE, completeHandler);  
  12.                 fileRef.addEventListener(Event.SELECT, selectHandler);  
  13.             }  
  14.               
  15.             private function bmpLoad():void  
  16.             {  
  17.                 fileRef.browse([new FileFilter("BMP""*.bmp")]);  
  18.             }  
  19.   
  20.             private function completeHandler(event:Event):void {  
  21.                 var byteArray:ByteArray = new ByteArray();  
  22.                 fileRef.data.readBytes(byteArray);  
  23.   
  24.                 var bmpDecoder:BMPDecoder = new BMPDecoder();  
  25.                 var tempBitmap:Bitmap = new Bitmap();  
  26.                 tempBitmap.bitmapData = bmpDecoder.decode( byteArray );   
  27.                 // byteArray BitmapData 로 디코딩     
  28.                   
  29.                 imgBmp.load(tempBitmap);  
  30.                 imgBmp.width = imgBmp.contentWidth;  
  31.                 imgBmp.height = imgBmp.contentHeight;              
  32.             }  
  33.       
  34.             private function selectHandler(event:Event):void {  
  35.                 var file:FileReference = FileReference(event.target);  
  36.                 file.load();  
  37.             }  
  38.   
  39.         ]]>  
  40.     </mx:Script>  
  41.     <mx:VBox height="100%" width="100%"   
  42.         horizontalCenter="0" verticalCenter="0"   
  43.         verticalAlign="middle" horizontalAlign="center" >  
  44.         <mx:Image width="101" height="145" id="imgBmp"/>  
  45.         <mx:Button label="BMP Load" click="{bmpLoad()}"/>  
  46.     </mx:VBox>  
  47. </mx:Application>  

 

BMPDecoder.as 보기

 


BMP 파일을 선택하시면  Image 컴포넌트에 깔끔하게 출력되는 것을 보실 수 있습니다.

하지만 다음과 같은 버그가 존재합니다. 




170픽셀 16bit BMP



171픽셀 16bit BMP 파일

위의 이미지에서 볼수 있는 것 처럼 BMP을 로드했을 때 이미지가 뒤틀려버리는 버그가 존재합니다.
왜 그럴까 한참을 고민했는데, 저희 팀장님이 힌트를 주시더군요. '윈도우어플에서도 비트맵 크기가 홀수일 경우 이미지가 저렇게 깨진다'고 말이죠. 실제로 테스트해보니 위와 같이 16bit이고 이미지의 너비가 홀수일 경우 위 처럼 이미지가 뒤틀려버리는 버그가 있습니다. (24bit, 32bit에서는 괜찮더군요)

이 버그에 해결책으로 저는 아래와 같이 decode() 메소드에서 이미지 너비를 결정해주는 로직 밑에 너비가 홀수일경우 강제로 1픽셀 늘리는 방법을 사용했습니다. 더 좋은 방법이 있을 것 같은데, 아시는 분은 알려주세요 :)

  1. // BMPDecoder 클래스 안의 decode 메소드  
  2. public function decode(data:ByteArray):BitmapData  
  3. {  
  4.     bytes = data;  
  5.     bytes.endian = Endian.LITTLE_ENDIAN;  
  6.     bytes.position = 0;  
  7.     readFileHeader();  
  8.     nInfoSize = bytes.readUnsignedInt();  
  9.     switch (nInfoSize)  
  10.     {  
  11.         case BITMAP_CORE_HEADER_SIZE:  
  12.             readCoreHeader();  
  13.             break;  
  14.         case BITMAP_INFO_HEADER_SIZE:  
  15.             readInfoHeader();  
  16.             break;  
  17.         default:  
  18.             readExtendedInfoHeader();  
  19.             break;  
  20.     }  
  21.   
  22.     if( (nWidth % 2) == 1 ) nWidth += 1;   
  23.     // 너비가 홀수일 경우 강제로 1픽셀 늘리기  
  24.     bd = new BitmapData(nWidth, nHeight);  
  25.     ...  

그럼 좋은 하루되세요!


예제파일 다운로드 :

 

 

 

 

 

=================================

=================================

=================================

 

 

 

출처: http://oohoot.tistory.com/22

 

보통 이미지를 그냥 로드만 해서 사용했을 경우 플래시상에서의 부담이 엄청나게 된다.
이 문제를 해결하기 위해서는 이미지를 껍질만 로드하고 나머지 알갱이는 버리는 형식으로 사용하면 된다.

아래의 코드를 보면 그리 어렵지 않게 알맹이만 빼낼 수 있다~

01 package
02 {
03     import flash.display.*;
04     import flash.events.*;
05     import flash.net.URLRequest;
06     import flash.system.LoaderContext;
07  
08     public class ImgLoader extends Sprite
09     {
10         private var _loader:Loader;
11         public function ImgLoader()
12         {
13             //일반적인 Loader 코드
14             _loader = new Loader();
15             _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
16             _loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError);
17             _loader.load(new URLRequest("image/test.jpg"), new LoaderContext(true));
18         }
19                                  
20                                 //로드된 이미지의 껍질만 복사한다.
21         private function duplicateImage(original:Bitmap):Bitmap {
22             //로드된 이미지의 껍질을 복사하여 Bitmap에 넣는다.
23             var image:Bitmap = new Bitmap(original.bitmapData.clone());
24             //복사된 이미지의 질감을 부드럽게 바꿔준다.
25             image.smoothing = true;
26             return image;
27         }
28  
29         private function onComplete(e:Event):void {
30             //duplicateImage함수를 이용해 복사된 이미지를 image라는 bitmap에 넣어준다.
31             var image:Bitmap = duplicateImage(Bitmap(_loader.content));
32                                                 //image라는 비트맵을 출력한다. loader를 바로 addChild 시켰을때와 동일한 모습을 보여준다.
33             addChild(image);
34                      
35             //껍질을 복사했기 때문에 필요없는 loader를 제거한다.
36             var loaderDispose:LoaderInfo = _loader.contentLoaderInfo;
37             //loader에 로드된 것이 액세스가 허용되어있는지 이미지가 맞는지를 확인한후
38             //처분한다(dispose)
39             if ( loaderDispose.childAllowsParent && loaderDispose.content is Bitmap) {
40                 (loaderDispose.content as Bitmap).bitmapData.dispose();
41             }
42              
43             //확실한 처리를 위해 실행한다.     
44             _loader.unload();
45             _loader = null;
46         }
47  
48         private function onError(e:Event):void {
49             _loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onComplete);
50             _loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, onError);
51         }
52     }
53      
54 }


위처럼 이미지를 로드하면 더욱 가벼운 플래시환경을 만들수있다.

 

 

 

 

=================================

=================================

=================================

 

 

 

출처: http://help.adobe.com/ko_KR/FlashPlatform/reference/actionscript/3/flash/display/Loader.html

 

 

예제  ( 예제 사용 방법 
다음 예제에서는 Loader 객체의 contentLoaderInfo 속성에 Loader 클래스 및 complete 이벤트를 사용하여 ActionScript 3.0에서 이미지를 로드하고 배치하는 방법을 보여 줍니다. ActionScriptExamples.com에서 제공하는 예제입니다.
var url:String = "http://www.helpexamples.com/flash/images/image2.jpg"; var urlRequest:URLRequest = new URLRequest(url); var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loader_complete); loader.load(urlRequest); addChild(loader);   function loader_complete(evt:Event):void {     var target_mc:Loader = evt.currentTarget.loader as Loader;     target_mc.x = (stage.stageWidth - target_mc.width) / 2;     target_mc.y = (stage.stageHeight - target_mc.height) / 2; }  

uncaughtErrorEvents

속성  
uncaughtErrorEvents:UncaughtErrorEvents  [읽기 전용]

 

언어 버전:  ActionScript 3.0
런타임 버전:  Flash Player 10.1, AIR 2

 

 

이 Loader 객체에 의해 로드된 SWF에서 처리되지 않은 오류가 발생하는 경우 uncaughtError 이벤트를 전달하는 객체입니다. try..catch 블록 밖에서 오류가 발생하는 경우 또는 리스너가 등록되지 않은 상태로 ErrorEvent 객체가 전달되는 경우 포착되지 않는 오류가 발생합니다.

Loader 객체의 uncaughtErrorEvents 속성은 객체가 직접 전달하는 이벤트가 아닌 객체를 통해 버블링되는 이벤트를 전달합니다. 이 속성은 대상 단계의uncaughtErrorEvent는 전달하지 않으며 캡처 및 버블링 단계의 이벤트만 전달합니다. Loader 객체가 정의되어 있는 현재 SWF에서 포착되지 않는 오류를 검색하려면LoaderInfo.uncaughtErrorEvents 속성을 대신 사용하십시오.

Loader 객체에 의해 로드된 내용이 AVM1(ActionScript 2) SWF 파일일 경우, AVM1 SWF 파일에서 잡히지 않은 오류는 uncaughtError 이벤트로 나타나지 않습니다.

 



구현 
    public function get uncaughtErrorEvents():UncaughtErrorEvents

관련 API 요소


예제  ( 예제 사용 방법 
다음 예제에서는 포착되지 않는 오류 이벤트 핸들러를 사용하여 로드된 SWF에서 포착되지 않는 오류를 검색하는 방법을 보여 줍니다. 이 예제에서는 포착되지 않는 오류를 검색하기 위해 uncaughtError 이벤트 핸들러를 정의합니다.

생성자 코드에서는 Loader 객체를 만들고 Loader 객체의 uncaughtErrorEvents 속성에 의해 전달되는 uncaughtError 이벤트에 사용할 리스너를 등록합니다.

uncaughtErrorHandler() 메서드 코드에서는 error 속성의 데이터 유형을 확인하고 이에 따라 응답합니다.

package {     import flash.display.Loader;     import flash.display.Sprite;     import flash.events.ErrorEvent;     import flash.events.UncaughtErrorEvent;     import flash.net.URLRequest;      public class LoaderUncaughtErrorEventExample extends Sprite     {         private var ldr:Loader;                  public function LoaderUncaughtErrorEventExample()         {             ldr = new Loader();             ldr.load(new URLRequest("child.swf"));             ldr.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler);         }                  private function uncaughtErrorHandler(event:UncaughtErrorEvent):void         {             if (event.error is Error)             {                 var error:Error = event.error as Error;                 // do something with the error             }             else if (event.error is ErrorEvent)             {                 var errorEvent:ErrorEvent = event.error as ErrorEvent;                 // do something with the error             }             else             {                 // a non-Error, non-ErrorEvent type was thrown and uncaught             }         }     } } 
생성자 세부 정보

Loader

() 생성자
public function Loader()

 

언어 버전:  ActionScript 3.0
런타임 버전:  AIR 1.0, Flash Player 9, Flash Lite 4

 

SWF, JPEG, GIF 또는 PNG 파일 등을 로드하는 데 사용할 수 있는 Loader 객체를 만듭니다. load() 메서드를 호출하여 해당 에셋을 Loader 인스턴스의 자식으로 로드합니다. 그런 다음, Loader 객체를 표시 목록에 추가할 수 있습니다(예: DisplayObjectContainer 인스턴스의 addChild() 메서드 사용). 에셋은 자신이 로드되는 Stage에 나타납니다.

표시 목록의 표시 객체 컨테이너에 해당 객체를 추가하지 않는 Loader 인스턴스의 "오프리스트(offlist)" 모드를 사용할 수도 있습니다. 이 모드에서 Loader 인스턴스는 응용 프로그램의 추가 모듈을 포함하는 SWF 파일을 로드하는 데 사용될 수 있습니다.

SWF 파일 로드가 완료되는 시점을 감지하기 위해 Loader 객체의 contentLoaderInfo 속성과 관련된 LoaderInfo 객체의 이벤트를 사용할 수 있습니다. 이때 모듈 SWF 파일의 코드가 실행되어 모듈을 초기화하고 시작할 수 있습니다. offlist 모드에서 Loader 인스턴스는 구성 요소 또는 미디어 에셋을 포함하는 SWF 파일을 로드하는 데 사용될 수 있습니다. 앞에서와 마찬가지로 LoaderInfo 객체 이벤트 알림을 사용하여 구성 요소가 로드를 완료하는 시점을 감지할 수 있습니다. 이때 응용 프로그램은 SWF 파일의 라이브러리에 있는 구성 요소와 미디어 에셋을 나타내는 ActionScript 3.0 클래스를 인스턴스화함으로써 해당 구성 요소와 에셋을 사용할 수 있습니다.

Loader 객체의 상태를 확인하려면 Loader 객체의 contentLoaderInfo 속성과 연관된 LoaderInfo 객체의 다음과 같은 이벤트를 모니터링합니다.

  • open 이벤트 - 로드가 시작될 때 전달됩니다.
  • ioError 또는 securityError 이벤트 - 파일을 로드할 수 없는 경우 또는 로드 프로세스 중 오류가 발생한 경우 전달됩니다.
  • progress 이벤트 - 파일이 로드되는 동안 계속해서 발생합니다.
  • complete 이벤트 - 파일 다운로드가 완료된 후, 로드된 동영상 클립의 메서드와 속성이 사용 가능한 상태가 되기 전에 전달됩니다.
  • init 이벤트 - 로드된 SWF 파일을 조작할 수 있도록, 로드된 SWF 파일의 속성과 메서드가 액세스 가능한 상태가 된 후에 전달됩니다. 이 이벤트는 complete 핸들러에 앞서 전달됩니다. 스트리밍 SWF 파일의 경우 init 이벤트는 complete 이벤트보다 훨씬 더 이전에 발생할 수 있습니다. 대부분의 경우에는 init 핸들러를 사용합니다.

참고(iOS에만 해당): iOS의 AIR 응용 프로그램에서는 ActionScript가 포함된 SWF 파일을 응용 프로그램 패키지에서만 로드할 수 있습니다. 이 제한 사항에는 ActionScript용으로 내보낸 클래스 이름이 포함된 에셋 같은 모든 ActionScript가 포함됩니다. SWF 파일을 로드할 때 부모 SWF와 동일한 응용 프로그램 도메인을 사용하여 SWF를 로드해야 합니다.

AIR 3.6 이하에서는 응용 프로그램 패키지에서 로드하든, 네트워크에서 로드하든 ActionScript 바이트 코드가 포함되지 않은 SWF 파일만 로드할 수 있습니다. ActionScript가 있는 외부 SWF 파일을 사용하는 대신 SWC 라이브러리를 만들어 기본 SWF에 연결하는 방법도 있습니다.

이 제한 사항은 응용 프로그램이 iOS 시뮬레이터(ipa-test-interpreter-simulator 또는 ipa-debug-interpreter-simulator)나 인터프리터 모드(ipa-test-interpreter 또는 ipa-debug-interpreter)에서 실행되는 경우에는 적용되지 않습니다.

 

관련 API 요소

메서드 세부 정보

close

() 메서드
public function close():void

 

언어 버전:  ActionScript 3.0
런타임 버전:  AIR 1.0, Flash Player 9, Flash Lite 4

 

 

현재 Loader 인스턴스에 대해 진행 중인 load() 메서드 작업을 취소합니다.

관련 API 요소

load

() 메서드  
public function load(request:URLRequest, context:LoaderContext = null):void

 

언어 버전:  ActionScript 3.0
런타임 버전:  AIR 1.0, Flash Player 9, Flash Lite 4

 

 

SWF, JPEG, 점진적 JPEG, 비애니메이션 GIF 또는 PNG 파일을 이 Loader 객체의 자식 객체로 로드합니다. 애니메이션 GIF 파일을 로드하는 경우 첫 번째 프레임만 표시됩니다. Loader 객체는 하나의 자식만을 포함할 수 있기 때문에 후속 load() 요청을 발생시키면 이전 요청(여전히 대기 중인 경우)이 종료되고 새 로드가 시작됩니다.

참고: AIR 1.5 및 Flash Player 10에서는 로드된 이미지의 최대 크기가 8,191픽셀(폭 또는 높이)이며 총 픽셀 수는 16,777,215픽셀을 초과할 수 없습니다. 따라서 로드된 이미지의 폭이 8,191픽셀이면 높이가 2,048픽셀 이하여야 합니다. Flash Player 9 이전 버전 및 AIR 1.1 이전 버전에서는 이 제한이 높이 2,880픽셀 및 폭 2,880픽셀입니다.

Loader 객체로 로드된 SWF 파일 또는 이미지는 Loader 객체의 부모 표시 객체로부터 위치, 회전 및 크기 조절 속성을 상속합니다.

이 메서드를 사용하여 로드한 동영상 또는 이미지를 제거하거나 진행 중인 로드 작업을 취소하려면 unload() 메서드를 사용합니다.

SWF 내용이 들어 있는 HTML 페이지에서 allowNetworking 매개 변수(object 및 embed 태그)를 설정하여 SWF 파일에서 이 메서드를 사용하지 않게 할 수 있습니다.

iOS 참고 사항

iOS의 AIR 응용 프로그램에서는 ActionScript가 포함된 SWF 파일을 응용 프로그램 패키지에서만 로드할 수 있습니다. 이 제한 사항에는 ActionScript용으로 내보낸 클래스 이름이 포함된 에셋 같은 모든 ActionScript가 포함됩니다. SWF 파일을 로드할 때 다음 예제에서처럼 부모 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);

또한 iOS에서 ActionScript ByteCode(ABC)를 포함한 SWF 파일을 로드했다가 언로드한 다음 다시 로드할 수 없습니다. 이를 수행하려는 경우 런타임 오류 3764가 발생합니다.

AIR 3.6 이하에서는 응용 프로그램 패키지에서 로드하든, 네트워크에서 로드하든 ActionScript 바이트 코드가 포함되지 않은 SWF 파일만 로드할 수 있습니다. ActionScript가 있는 외부 SWF 파일을 사용하는 대신 SWC 라이브러리를 만들어 기본 SWF에 연결하는 방법도 있습니다.

이 제한 사항은 응용 프로그램이 iOS 시뮬레이터(ipa-test-interpreter-simulator 또는 ipa-debug-interpreter-simulator)나 인터프리터 모드(ipa-test-interpreter 또는 ipa-debug-interpreter)에서 실행되는 경우에는 적용되지 않습니다.

Loader 보안

이 메서드를 사용할 때는 Loader 클래스 설명에 나와 있는 Flash Player 보안 모델을 고려해야 합니다.

Flash Player 10 이상에서는 multipart Content-Type(예: "multipart/form-data")을 사용하고 POST 본문 내 "content-disposition" 헤더에 "filename" 매개 변수를 지정하여 업로드를 처리하는 경우 POST 작업이 업로드에 적용되는 보안 규칙의 영향을 받을 수 있습니다.

  • POST 작업은 마우스 클릭이나 키 누르기 같은 사용자 동작에 대한 응답으로 수행됩니다.
  • POST 작업이 크로스 도메인인 경우, 즉 POST 대상이 POST 요청을 보내는 SWF 파일과 같은 서버에 없는 경우 대상 서버는 크로스 도메인 액세스를 허용하는 URL 정책 파일을 제공해야 합니다.

또한 multipart Content-Type의 경우 구문이 RFC2046 표준에 따라 유효해야 합니다. 구문이 유효하지 않은 경우 POST 작업은 업로드에 적용되는 보안 규칙의 영향을 받을 수 있습니다.

보안에 대한 자세한 내용은 Flash Player 개발자 센터 항목: 보안을 참조하십시오.

 

매개 변수

  request:URLRequest — 로드할 SWF, JPEG, GIF 또는 PNG 파일의 절대 또는 상대 URL입니다. 상대 경로는 기본 SWF 파일에 상대적이어야 하며, 절대 URL은 프로토콜 참조(예: http:// 또는 file:///)를 포함해야 합니다. 파일 이름에는 디스크 드라이브 이름을 포함할 수 없습니다.
 
  context:LoaderContext (default = null) — LoaderContext 객체로, 다음을 정의하는 속성을 갖습니다.
  • 객체를 로드할 때 정책 파일의 존재에 대한 확인 여부
  • 로드된 객체에 대한 ApplicationDomain
  • 로드된 객체에 대한 SecurityDomain
  • 로드된 이미지 객체의 ImageDecodingPolicy
context 매개 변수를 지정하지 않거나 이 매개 변수가 null 객체를 참조하면 로드된 내용이 자체 보안 도메인에 유지됩니다.
iOS에만 해당: AIR for iOS에서 load() 메서드를 호출할 때 LoaderContext 인스턴스가 기본 응용 프로그램 도메인(ApplicationDomain.currentDomain)을 지정해야 합니다.
자세한 내용은 LoaderContext 클래스의 속성에 대한 설명을 참조하십시오.

 


이벤트
  asyncError:AsyncErrorEvent — LoaderContext.requestedContentParent 속성이 지정되어 있고 로드된 내용을 지정된 DisplayObjectContainer에 자식으로 추가할 수 없는 경우 contentLoaderInfo 객체에 의해 전달됩니다. 이는 로드된 내용이 flash.display.AVM1Movie이거나 addChild()의 requestedContentParent 호출에 오류가 발생할 때 일어납니다.
 
  complete:Event — 파일 로드가 완료되면 contentLoaderInfo 객체에서 전달됩니다. complete 이벤트는 항상 init 이벤트 이후에 전달됩니다.
 
  httpStatus:HTTPStatusEvent — HTTP를 통해 네트워크 요청이 수행되고 Flash Player가 해당 HTTP 상태 코드를 감지할 수 있을 때 contentLoaderInfo 객체에서 전달됩니다.
 
  init:Event — 로드된 SWF 파일의 속성 및 메서드에 액세스할 수 있을 때 contentLoaderInfo 객체에서 전달됩니다. init 이벤트는 항상 complete 이벤트 이전에 전달됩니다.
 
  ioError:IOErrorEvent — 로드 작업 실패를 유발하는 입력 또는 출력 오류가 발생할 때 contentLoaderInfo 객체에서 전달됩니다.
 
  open:Event — 로드 작업이 시작될 때 contentLoaderInfo 객체에서 전달됩니다.
 
  progress:ProgressEvent — 로드 작업이 진행되는 동안 데이터가 수신될 때 contentLoaderInfo 객체에서 전달됩니다.
 
  securityError:SecurityErrorEvent — local-with-filesystem 샌드박스의 SWF 파일이 local-with-networking 샌드박스의 내용을 로드하려고 하거나 그 반대의 경우contentLoaderInfo 객체에서 전달됩니다.
 
  securityError:SecurityErrorEvent — LoaderContext.requestedContentParent 속성이 지정되어 있고 LoaderContext.requestedContentParent의 보안 샌드박스가 로드된 SWF에 액세스할 수 없는 경우 contentLoaderInfo 객체에 의해 전달됩니다.
 
  unload:Event — 로드된 객체가 제거될 때 contentLoaderInfo 객체에서 전달됩니다.

오류
  IOError — request 객체의 digest 속성이 null이 아닙니다. SWZ 파일(Adobe 플랫폼 구성 요소)을 로드할 때는 URLRequest 객체가 URLLoader.load() 메서드 호출에 사용되는 경우에만 URLRequest 객체의 digest 속성을 설정해야 합니다.
 
  SecurityError — LoaderContext.securityDomain의 값이 null 또는 SecurityDomain.currentDomain이어야 합니다. 이는 로드된 미디어를 원본 보안 샌드박스 또는 사용자 고유의 보안 샌드박스(정책 파일 필요)에만 배치할 수 있음을 의미합니다.
 
  SecurityError — 로컬 SWF 파일이 LoaderContext.securityDomain을 null 이외의 값으로 설정할 수 없습니다. 로컬에 위치하지 않은 미디어를 로컬 샌드박스로 가져오거나, 다른 로컬 미디어를 원본 샌드박스가 아닌 다른 위치에 배치하는 것은 허용되지 않습니다.
 
  SecurityError — 일반적으로 예약된 포트에 연결할 수 없습니다. 차단된 포트의 전체 목록은 ActionScript 3.0 개발자 안내서의 "제한적 네트워킹 API"를 참조하십시오.
 
  SecurityError — context 매개 변수의 applicationDomain 또는 securityDomain 속성이 허용되지 않는 도메인에 대한 속성인 경우입니다.
 
  SecurityError — 로컬 SWF 파일이 context 매개 변수의 securityDomain 속성을 사용하려는 경우입니다.
 
  IllegalOperationError — context 매개 변수의 requestedContentParent 속성이 Loader인 경우입니다.
 
  IllegalOperationError — LoaderContext.parameters 매개 변수가 null이 아니면서 문자열이 아닌 값을 가질 경우입니다.
 
  IllegalOperationError — iOS에서 응용 프로그램이 기본 응용 프로그램 도메인 이외의 응용 프로그램 도메인에 SWF 파일을 로드하려는 경우
 
  IllegalOperationError — iOS에서 응용 프로그램이 ABC 코드가 포함된 SWF를 로드했다가 언로드한 후 다시 로드하려는 경우
 
  Error — iOS에서 응용 프로그램이 ActionScript 코드가 포함되어 있는 SWF 파일을 응용 프로그램 패키지 이외의 위치에서 로드하려는 경우 이 오류를 catch할 수 없습니다. 응용 프로그램 화면에 "컴파일되지 않은 ActionScript"라는 제목의 대화 상자가 나타납니다. AIR 3.6 이하에서는 ActionScript가 포함된 SWF 파일을 로드하려 하면 파일이 외부 파일이든, 응용 프로그램 패키지에 포함되어 있든 관계없이 이 오류가 발생합니다.

기타 예제

추가 정보

관련 API 요소

loadBytes

() 메서드  
public function loadBytes(bytes:ByteArray, context:LoaderContext = null):void

 

언어 버전:  ActionScript 3.0
런타임 버전:  AIR 1.0, Flash Player 9, Flash Lite 4

 

 

ByteArray 객체에 저장된 이진 데이터에서 로드합니다.

loadBytes() 메서드는 비동기적입니다. 로드된 객체의 속성에 액세스하기 전에 "init" 이벤트가 발생할 때까지 기다려야 합니다.

이 메서드를 사용할 때는 Loader 클래스 설명에 나와 있는 Flash Player 보안 모델을 고려해야 합니다.

참고(iOS에만 해당): iOS의 AIR 응용 프로그램에서는 ActionScript가 포함된 SWF 파일을 응용 프로그램 패키지에서만 로드할 수 있습니다. 이 제한 사항에는 ActionScript용으로 내보낸 클래스 이름이 포함된 에셋 같은 모든 ActionScript가 포함됩니다. SWF 파일을 로드할 때 부모 SWF와 동일한 응용 프로그램 도메인을 사용하여 SWF를 로드해야 합니다.

AIR 3.6 이하에서 이 메서드 호출은 iOS에 아무런 효과가 없습니다.

 

매개 변수

  bytes:ByteArray — ByteArray 객체입니다. ByteArray의 내용은 Loader 클래스에서 지원되는 파일 형식(SWF, GIF, JPEG 또는 PNG)일 수 있습니다.
 
  context:LoaderContext (default = null) — LoaderContext 객체입니다. LoaderContext 객체의 applicationDomain 속성만 적용되며, LoaderContext 객체의checkPolicyFile 및 securityDomain 속성은 적용되지 않습니다.context 매개 변수를 지정하지 않거나 이 매개 변수가 null 객체를 참조하면 내용이 현재 보안 도메인에 로드됩니다. 이는 Flash Player 보안 설명서에서 "가져오기 로딩"이라고 하는 프로세스입니다. 일반적으로 로드하는 SWF 파일이 원격 SWF를 자신의 코드에 통합하여 원격 SWF를 신뢰하는 경우 로드하는 SWF는 원격 SWF를 자신의 보안 도메인으로 직접 가져올 수 있습니다.
보안에 대한 자세한 내용은 Flash Player 개발자 센터 항목: 보안을 참조하십시오.

 


이벤트
  asyncError:AsyncErrorEvent — LoaderContext.requestedContentParent 속성이 지정되어 있고 로드된 내용을 지정된 DisplayObjectContainer에 자식으로 추가할 수 없는 경우 contentLoaderInfo 객체에 의해 전달됩니다. 이는 로드된 내용이 flash.display.AVM1Movie이거나 addChild()의 requestedContentParent 호출에 오류가 발생할 때 일어납니다.
 
  complete:Event — 작업이 완료될 때 contentLoaderInfo 객체에 의해 전달됩니다. complete 이벤트는 항상 init 이벤트 이후에 전달됩니다.
 
  init:Event — 로드된 데이터의 속성 및 메서드에 액세스할 수 있을 때 contentLoaderInfo 객체에 의해 전달됩니다. init 이벤트는 항상 complete 이벤트 이전에 전달됩니다.
 
  ioError:IOErrorEvent — 런타임이 바이트 배열의 데이터를 구문 분석할 수 없을 때 contentLoaderInfo 객체에 의해 전달됩니다.
 
  open:Event — 작업이 시작될 때 contentLoaderInfo 객체에 의해 전달됩니다.
 
  progress:ProgressEvent — 데이터가 메모리에서 전송될 때 contentLoaderInfo 객체에 의해 전달됩니다.
 
  securityError:SecurityErrorEvent — LoaderContext.requestedContentParent 속성이 지정되어 있고 LoaderContext.requestedContentParent의 보안 샌드박스가 로드된 SWF에 액세스할 수 없는 경우 contentLoaderInfo 객체에 의해 전달됩니다.
 
  unload:Event — 로드된 객체가 제거될 때 contentLoaderInfo 객체에서 전달됩니다.

오류
  ArgumentError — ByteArray 객체의 length 속성이 0보다 작거나 같은 경우입니다.
 
  IllegalOperationError — context 매개 변수의 checkPolicyFile 또는 securityDomain 속성이 null이 아닌 경우입니다.
 
  IllegalOperationError — context 매개 변수의 requestedContentParent 속성이 Loader인 경우입니다.
 
  IllegalOperationError — LoaderContext.parameters 매개 변수가 null이 아니면서 문자열이 아닌 값을 가질 경우입니다.
 
  IllegalOperationError — iOS에서 응용 프로그램이 기본 응용 프로그램 도메인 이외의 응용 프로그램 도메인에 SWF 파일을 로드하려는 경우
 
  IllegalOperationError — iOS에서 응용 프로그램이 ABC 코드가 포함된 SWF 파일을 로드했다가 언로드한 후 다시 로드하려는 경우
 
  Error — iOS에서 응용 프로그램이 ActionScript 코드가 포함되어 있는 SWF 파일을 응용 프로그램 패키지 이외의 위치에서 로드하려는 경우 이 오류를 catch할 수 없습니다. 응용 프로그램 화면에 "컴파일되지 않은 ActionScript"라는 메시지의 대화 상자가 나타납니다. AIR 3.6 이하에서는 ActionScript가 포함된 SWF 파일을 로드하려 하면 파일이 외부 파일이든, 응용 프로그램 패키지에 포함되어 있든 관계없이 이 오류가 발생합니다.
 
  SecurityError — 제공된 context 속성의 applicationDomain 속성이 허용되지 않는 도메인에 대한 속성인 경우입니다.
 
  SecurityError — 일반적으로 예약된 포트에 연결할 수 없습니다. 차단된 포트의 전체 목록은 ActionScript 3.0 개발자 안내서의 "제한적 네트워킹 API"를 참조하십시오.

추가 정보

관련 API 요소

    loadFilePromise

() 메서드  
public function loadFilePromise(promise:IFilePromise, context:LoaderContext = null):void

 

언어 버전:  ActionScript 3.0
런타임 버전:  AIR 2.5

 

 

IFilePromise 인스턴스를 로드합니다.

loadFilePromise 메서드는 IFilePromise 객체를 사용하고 이진 데이터를 로드합니다. 데이터가 점진적 문자열(예: 비디오)인 경우 "init" 또는 progress 이벤트를 기다린 후에 로드된 객체의 속성에 액세스합니다. 그렇지 않으면 complete 이벤트를 기다려서 데이터가 완전히 로드되었는지를 확인합니다.

이 메서드를 사용할 때는 Loader 클래스 설명에 나와 있는 Flash Player 보안 모델을 고려해야 합니다.

 

매개 변수

  promise:IFilePromise — IFilePromise 객체입니다. 객체의 데이터 소스는 Loader 클래스에서 지원되는 파일 형식(SWF, GIF, JPEG 또는 PNG)일 수 있습니다.
 
  context:LoaderContext (default = null) — LoaderContext 객체입니다. LoaderContext 객체의 applicationDomain 속성만 적용되며, LoaderContext 객체의checkPolicyFile 및 securityDomain 속성은 적용되지 않습니다.context 매개 변수를 지정하지 않거나 이 매개 변수가 null 객체를 참조하면 내용이 현재 보안 도메인에 로드됩니다. 이는 Flash Player 보안 설명서에서 "가져오기 로딩"이라고 하는 프로세스입니다. 일반적으로 로드하는 SWF 파일이 원격 SWF를 자신의 코드에 통합하여 원격 SWF를 신뢰하는 경우 로드하는 SWF는 원격 SWF를 자신의 보안 도메인으로 직접 가져올 수 있습니다.
보안에 대한 자세한 내용은 Flash Player 개발자 센터 항목: 보안을 참조하십시오.

 


이벤트
  asyncError:AsyncErrorEvent — LoaderContext.requestedContentParent 속성이 지정되어 있고 로드된 내용을 지정된 DisplayObjectContainer에 자식으로 추가할 수 없는 경우 contentLoaderInfo 객체에 의해 전달됩니다. 이는 로드된 내용이 flash.display.AVM1Movie이거나 addChild()의 requestedContentParent 호출에 오류가 발생할 때 일어납니다.
 
  complete:Event — 작업이 완료될 때 contentLoaderInfo 객체에 의해 전달됩니다. complete 이벤트는 항상 init 이벤트 이후에 전달됩니다.
 
  init:Event — 로드된 데이터의 속성 및 메서드에 액세스할 수 있을 때 contentLoaderInfo 객체에 의해 전달됩니다. init 이벤트는 항상 complete 이벤트 이전에 전달됩니다.
 
  ioError:IOErrorEvent — 런타임에 데이터 소스에서 데이터를 구문 분석할 수 없는 경우 또는 데이터 소스 스트림을 읽을 수 없는 경우에 contentLoaderInfo 객체에 의해 전달됩니다.
 
  open:Event — 작업이 시작될 때 contentLoaderInfo 객체에 의해 전달됩니다.
 
  progress:ProgressEvent — 데이터가 메모리에서 전송될 때 contentLoaderInfo 객체에 의해 전달됩니다.
 
  securityError:SecurityErrorEvent — LoaderContext.requestedContentParent 속성이 지정되어 있고 LoaderContext.requestedContentParent의 보안 샌드박스가 로드된 SWF에 액세스할 수 없는 경우 contentLoaderInfo 객체에 의해 전달됩니다.
 
  unload:Event — 로드된 객체가 제거될 때 contentLoaderInfo 객체에서 전달됩니다.

오류
  IllegalOperationError — context 매개 변수의 requestedContentParent 속성이 Loader인 경우입니다.
 
  IllegalOperationError — LoaderContext.parameters 매개 변수가 null이 아니면서 문자열이 아닌 값을 가질 경우입니다.
 
  ArgumentError — 매개 변수로 전달된 IFilePromise 객체가 null인 경우입니다.

관련 API 요소

unload

() 메서드  
public function unload():void

 

언어 버전:  ActionScript 3.0
런타임 버전:  AIR 1.0, Flash Player 9, Flash Lite 4

 

 

load() 메서드를 사용하여 로드된 이 Loader 객체의 자식을 제거합니다. 관련된 LoaderInfo 객체의 property는 null로 재설정됩니다. 해당 자식은 다른 객체에서 참조할 수 있기 때문에 반드시 삭제되지는 않지만, 더 이상 Loader 객체의 자식이 아닙니다.

unload() 메서드를 호출하면 Loader 객체의 contentLoaderInfo 속성이 null로 설정됩니다. SWF와 함께 로드된 모든 시각적 에셋이 언로드되고 메모리에서 제거됩니다. 로드된 SWF의 ActionScript 클래스 정의는 메모리에 그대로 유지되고 로드된 SWF와 같은 응용 프로그램 도메인의 코드는 해당 클래스의 인스턴스에 액세스하여 새 인스턴스를 만들 수 있습니다.

참고(iOS에만 해당): AIR 3.6 이하에서 이 메서드는 iOS에 아무런 효과가 없습니다.

자식 SWF 파일을 언로드하기 전에 해당 자식 SWF 파일의 객체(예: LocalConnection, NetConnection, NetStream 및 Sound)에 있는 모든 스트림을 확실하게 닫는 것이 좋습니다. 그렇지 않으면 자식 SWF 파일이 언로드된 경우에도 자식 SWF 파일의 오디오가 계속해서 재생될 수 있습니다. 자식 SWF 파일의 스트림을 닫으려면 이벤트 리스너를unload 이벤트에 대해 수신하는 자식에 추가합니다. 부모가 Loader.unload()를 호출하면 unload 이벤트가 자식에 전달됩니다. 다음 코드는 이렇게 하는 방법을 보여 줍니다.

function closeAllStreams(evt:Event) {      myNetStream.close();     mySound.close();     myNetConnection.close();     myLocalConnection.close(); }  myMovieClip.loaderInfo.addEventListener(Event.UNLOAD, closeAllStreams);

 

관련 API 요소

unloadAndStop

() 메서드  
public function unloadAndStop(gc:Boolean = true):void

 

언어 버전:  ActionScript 3.0
런타임 버전:  Flash Player 10, AIR 1.5, Flash Lite 4

 

 

자식 SWF 파일 내용을 언로드하고 로드된 SWF 파일의 명령 실행을 중지합니다. 이 메서드는 자식 SWF 파일의 EventDispatcher, NetConnection, Timer, Sound 또는 Video 객체에 대한 참조를 제거하여 Loader.load() 또는 Loader.loadBytes()를 사용하여 로드되고 있는 SWF 파일을 언로드합니다. 따라서 자식 SWF 파일 및 자식 SWF 파일의 표시 목록에서 다음 동작이 발생합니다.

  • 사운드가 중지됩니다.
  • Stage 이벤트 리스너가 제거됩니다.
  • enterFrameframeConstructedexitFrameactivate 및 deactivate의 이벤트 리스너가 제거됩니다.
  • 타이머가 중지됩니다.
  • Camera 및 Microphone 인스턴스가 분리됩니다.
  • 동영상 클립이 중지됩니다.

unloadAndStop() 메서드를 호출하면 Loader 객체의 contentLoaderInfo 속성이 null로 설정됩니다. SWF와 함께 로드된 모든 시각적 에셋이 언로드되고 메모리에서 제거됩니다. 로드된 SWF의 ActionScript 클래스 정의는 메모리에 그대로 유지되고 로드된 SWF와 같은 응용 프로그램 도메인의 코드는 해당 클래스의 인스턴스에 액세스하여 새 인스턴스를 만들 수 있습니다.

참고(iOS에만 해당): AIR 3.6 이하에서 이 메서드는 iOS에 아무런 효과가 없습니다.

 

매개 변수

  gc:Boolean (default = true) — 자식 SWF 객체를 대상으로 가비지 수집기를 실행할지 여부(true 또는 false)를 나타내는 힌트를 제공합니다. 여러 객체를 비동기적으로 언로드하는 경우 gc 매개 변수를 false로 설정하면 응용 프로그램 성능이 향상될 수 있습니다. 그러나 이 매개 변수를 false로 설정하면 자식 SWF 파일의 미디어와 표시 객체가 unloadAndStop() 명령을 실행한 후에도 메모리에 유지될 수 있습니다.

 

관련 API 요소

LoaderExample.as


다음 예제에서는 LoaderExample 클래스를 사용하여 다양한 이벤트 리스너를 사용하는 방법을 보여 줍니다. 이는 다음 단계로 이루어집니다.
  1. 이미지 파일의 이름과 위치를 나타내는 url 속성이 만들어집니다.
  2. LoaderExample 생성자에서 loader라는 새 Loader 객체를 만든 후 단계 3에 설명된 configureListeners() 메서드에 전달합니다.
  3. 생성자가 파일 이름 및 위치를 나타내도록 전달된 url이 있는 새 URLRequest 객체 request를 만듭니다.
  4. request 객체가 loader 객체의 load() 메서드로 전달되며, 이 메서드는 이미지를 표시 목록으로 로드합니다.
  5. clickHandler 이벤트 리스너가 로더에서 click 이벤트에 대해 등록됩니다. 마우스를 클릭하면 로드된 이미지가 언로드됩니다.
  6. configureListeners() 메서드가 다음 메서드를 사용하여 일곱 개의 이벤트 리스너를 추가합니다.
    • completeHandler() 메서드는 이미지 로드가 완료되면 실행됩니다.
    • httpStatusHandler() 메서드는 이미지가 로컬에 로드되지 않은 경우 네트워크 요청이 사용 가능하게 되고 Flash Player에서 해당 요청을 감지할 수 있을 때만 실행됩니다.
    • initHandler() 메서드는 completeHandler() 메서드 이전 및 progressHandler() 메서드 이후에 실행됩니다. 일반적으로 SWF 파일을 로드할 경우에는 init이벤트가 더 유용합니다.
    • ioErrorHandler() 메서드는 이미지 파일을 사용할 수 없거나 액세스할 수 없는 경우 실행됩니다.
    • openHandler() 메서드는 이미지 파일을 처음 열 때 실행됩니다.
    • progressHandler() 메서드는 이미지 파일을 로드하기 시작할 때 실행되며 이미지 로드가 완료되면 다시 한 번 실행됩니다.
    • unLoadHandler() 메서드는 사용자가 이미지를 클릭할 때 unload() 메서드를 사용하여 이미지가 언로드되면 실행됩니다.

검토를 진행할 때는 다음과 같은 요구 사항을 염두에 두어야 합니다.

  • 이 예제에서는 컴파일된 SWF 파일과 같은 디렉토리에 Image.gif 파일이 있어야 합니다. 기본 SWF 파일의 크기에 알맞은 영역이 있는 이미지를 사용합니다.
  • 이 예제에서는 LoaderInfo 객체에 사용 가능한 모든 이벤트를 활용하지만, 대부분의 경우 하위 세트만 필요합니다. 특히, 이미지 파일만을 로드할 경우 complete 이벤트(또는 ioError 이벤트)만 있으면 로컬 이미지를 로드하는 데는 충분합니다.
package {     import flash.display.Loader;     import flash.display.Sprite;     import flash.events.*;     import flash.net.URLRequest;      public class LoaderExample extends Sprite {         private var url:String = "Image.gif";          public function LoaderExample() {             var loader:Loader = new Loader();             configureListeners(loader.contentLoaderInfo);             loader.addEventListener(MouseEvent.CLICK, clickHandler);              var request:URLRequest = new URLRequest(url);             loader.load(request);              addChild(loader);         }          private function configureListeners(dispatcher:IEventDispatcher):void {             dispatcher.addEventListener(Event.COMPLETE, completeHandler);             dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);             dispatcher.addEventListener(Event.INIT, initHandler);             dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);             dispatcher.addEventListener(Event.OPEN, openHandler);             dispatcher.addEventListener(ProgressEvent.PROGRESS, progressHandler);             dispatcher.addEventListener(Event.UNLOAD, unLoadHandler);         }          private function completeHandler(event:Event):void {             trace("completeHandler: " + event);         }          private function httpStatusHandler(event:HTTPStatusEvent):void {             trace("httpStatusHandler: " + event);         }          private function initHandler(event:Event):void {             trace("initHandler: " + event);         }          private function ioErrorHandler(event:IOErrorEvent):void {             trace("ioErrorHandler: " + event);         }          private function openHandler(event:Event):void {             trace("openHandler: " + event);         }          private function progressHandler(event:ProgressEvent):void {             trace("progressHandler: bytesLoaded=" + event.bytesLoaded + " bytesTotal=" + event.bytesTotal);         }          private function unLoadHandler(event:Event):void {             trace("unLoadHandler: " + event);         }          private function clickHandler(event:MouseEvent):void {             trace("clickHandler: " + event);             var loader:Loader = Loader(event.target);             loader.unload();         }     } } 

 

 

 

=================================

=================================

=================================

 

 

반응형
그리드형


관련글 더보기

댓글 영역