'팁&테크/ActionScript3'에 해당되는 글 24건

  1. 2016.03.17 TweenMax, TweenLite 관련 메모
  2. 2016.03.09 [FeathersUI] PageIndicator 사용 시 페이지수가 많은 경우.
  3. 2016.01.22 Starling 관련 메모
  4. 2015.11.18 ANE 만들기
  5. 2015.08.28 Adobe Scout 사용 시 advanced-telemetry 옵션 관련
  6. 2015.04.23 FreshPlanet 의 ANE-Push-Notification 사용할때 참고
  7. 2015.03.24 [Starling/FeathersUI] ListCollection 정렬
  8. 2015.02.25 Simple encrypt/decrypt(AS3, PHP)
  9. 2015.02.24 이미지를 ATF 파일로 사용할 때 참고
  10. 2015.02.05 모바일(앨범)에서 이미지 업로드(CameraRoll사용)
2016. 3. 17. 14:07

TweenMax, TweenLite 관련 메모

TweenMax

yoyo 기능을 사용할 경우 반드시 repeqt:1 이 들어가야 됨

2016. 3. 9. 19:31

[FeathersUI] PageIndicator 사용 시 페이지수가 많은 경우.

FeathersUI의 PageIndicator를 사용할때 페이지수가 많을 경우 가로로 무작정 늘어나서 화면을 벗어나버린다.


이 경우에는 ScrollContainer 안에 PageIndicator를 넣고 스크롤을 이동시키도록 하면 문제를 해결할 수 있다.


사용되는 크기는 적당히.


설정--------------------------


var pageLayout:HorizontalLayout = new HorizontalLayout();
pageLayout.horizontalAlign = HorizontalLayout.HORIZONTAL_ALIGN_CENTER;

var pageContainer:ScrollContainer = new ScrollContainer();
pageContainer.width = 333;
pageContainer.height = 67;
pageContainer.layout = pageLayout;
addChild(pageContainer);

var friendListPage:PageIndicator = new PageIndicator();
friendListPage.pageCount = friendList.horizontalPageCount;
friendListPage.horizontalAlign = PageIndicator.HORIZONTAL_ALIGN_CENTER;
friendListPage.interactionMode = PageIndicator.INTERACTION_MODE_PRECISE;
friendListPage.normalSymbolFactory = function():DisplayObject
{
return new Image(......);
};
friendListPage.selectedSymbolFactory = function():DisplayObject
{
return new Image(......);
};
pageContainer.addChild(friendListPage);

처리--------------------------

#아래부분은 Event.CHANGE 일떄 호출되도록 하고.

#각각의 수치는 ScrollContainer의 크기와 출력되는 Symbol의 크기와 관련이 있으니 적당히 조절해야 함

private function onFriendListChange(e:Event):void
{
    var list:PageIndicator = PageIndicator(e.currentTarget);
    view.friendList.scrollToPageIndex(list.selectedIndex, 0);
    view.friendList.selectedIndex = -1;

    view.pageContainer.validate();
    if(list.selectedIndex < 5)
        view.pageContainer.scrollToPosition(0, 0, 0.5);
    else if(list.selectedIndex >= list.pageCount - 5)
        view.pageContainer.scrollToPosition((list.pageCount - 9) * 37, 0, 0.5);
    else
        view.pageContainer.scrollToPosition((list.selectedIndex - 4) * 37, 0, 0.5);
}


2016. 1. 22. 17:04

Starling 관련 메모

1. mask 사용 시 주의

Starling 1.7 부터 기본적으로 mask 속성이 추가 되었다.

mask 기능을 사용하기 위해서는 반드시 Manifest XML 파일에 <depthAndStencil>true</depthAndStencil> 와 같이 설정되있어야 한다.

2015. 11. 18. 18:44

ANE 만들기

#IntelliJ를 사용

1. 프로젝트를 Android - Gradle: Android Module 선택


2. 패키지명은 여러곳에서 사용하니 잘 정할 것. 

  "New Project" 창에서 Theme => None, Create activity 는 체크해제후 프로젝트를 생성한다.

  !!중요 minSdk, targetSdk, compileSdk 를 최신버전으로 선택하고 프로젝트를 생성해야 아래와 같은 오류가 발생하지 않는다.

   프로젝트를 생성한 후에 app/build.gradle 에서 Sdk 버전을 변경하자.

   minSdk 를 낮은 버전으로 할 경우 하위버전에서 상위버전의 UI를 사용하기 위해 appcompat_v7이란 디렉토리가 생기고 그로인해서 오류가 발생하니 주의할 것.


참고!!

  #Error:Gradle: Execution failed for task ':app:processDebugResources'.

> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '경로\Android\android-sdk\build-tools\22.0.1\aapt.exe'' finished with non-zero exit value 1


3. FlashRuntimeExtensions.jar 파일을 프로젝트의 libs 경로에 복사

   FlashRuntimeExtensions.jar 파일은 AIRSDK설치경로\lib\android 에보면 있다.


4. app/build.gradle 파일을 열어 

   apply plugin 의 com.android.application 값을 com.android.library 로 변경하고

   library는 applicationId를 가질 수 없으니 applicationId 를 주석처리 한다.


5. app/src/main/java/패키지명 밑에 아래 3종류의 파일을 작성한다.(앞의 ___는 아무 이름이나 해)

  ___Extension.java : Native기능을 생성?하는 파일

  ___Context.java : 외부에서 호출한 메소드를 실제 클래스로 매핑되는 정보를 정의하는 파일

  ___Function.java : 실제 기능을 구현하는 파일

  

___Extension.java 파일 ----------------------------------------

@Override

public FREContext createContext(String s) {

    Log.e("___Extension", "call createContext");

    return new ___Context();  //생성한 ___Context() 클래스를 리턴해주면 됨

}


___Context.java 파일 ----------------------------------------

@Override

public Map<String, FREFunction> getFunctions() {

    Map<String, FREFunction> map = new HashMap<String, FREFunction>();

    map.put("getSample", new ___Function());  //외부에서는 getSample 로 호출하고 실제 기능은 ___Function

    return map;

}


___Function.java 파일 ----------------------------------------

@Override

public FREObject call(FREContext freContext, FREObject[] args) {

    return null; //이곳에 기능을 구현한다

}


참고로 이 파일에서 아래와 같이 Air에서 사용중인 activity를 가져올 수 있으며

Activity activity =  freContext.getActivity();


전달된 인자값은 아래와 같이 타입을 지정해서 받는다.

Boolean flag =  args[0].getAsBool(); //getAsInt(), getAsDouble(), getAsBool(), getAsString() 사용가능


6. Build(Make Project, Rebuild Project)를 하면 app/build/outputs/aar 에 app-debug.arr 파일이 생성된다.

   이 파일을 압축프로그램(반디집)등으로 압축해제하면 classes.jar 파일이 있는데 파일이 프로그램이니 이름을 바꿔서 저장하자.


7. Air와 ane를 연결할 swc 만들기

  새 프로젝트 - Flash 선택, 

  Target platform : Mobile 선택, Pure Acriotnscript 체크

  Output type : Libray 선택

  Flex/Air SDK : Air_sdk 버전 선택 후 프로젝트 생성

  

 /src/패키지명/__클래스명.as 클래스 생성


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package 패키지명
{
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.events.IEventDispatcher;
    import flash.events.StatusEvent;
    import flash.external.ExtensionContext;
 
    public class __클래스명 extends EventDispatcher
    {
        private static const EXTENSION_ID:String = "패키지명";
        private var context:ExtensionContext;
 
        public function __클래스명(target:IEventDispatcher = null)
        {
            super(target);
 
            try {
                context = ExtensionContext.createExtensionContext(EXTENSION_ID, null);
                context.addEventListener(StatusEvent.STATUS, onStatusHandler);
            } catch(e:Error) {
                trace(e.message, e.errorID);
            }
        }
 
        private function onStatusHandler(e:Event):void
        {
 
        }
 
        public function getSample(flag:Boolean):void
        {
            context.call("getSample", flag); //___Context.java 파일에 정의 메소드명
        }
    }
}
cs


SWC 파일을 각각 만든다(ios, android, default)

그리고 swc 파일을 압축툴로 열어보면 library.swf 파일이 있을텐데 그걸 각각 놔둔다.

 


8. extension.xml 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<extension xmlns="http://ns.adobe.com/air/extension/17.0">
    <id>com.sample</id<!-- 패키지명 -->
    <versionNumber>1.1</versionNumber>
    <platforms>
        <platform name="iPhone-ARM">
            <applicationDeployment>
                <nativeLibrary>ios_filename.a</nativeLibrary<!-- IOS 라이브러리파일 -->
                <initializer>ExtInitializer</initializer<!-- 초기화 메소드명 -->
                <finalizer>ExtFinalizer</finalizer<!-- 종료 메소드명 -->
            </applicationDeployment>
        </platform>
        <platform name="Android-ARM">
            <applicationDeployment>
                <nativeLibrary>android_filename.jar</nativeLibrary<!-- ANDROID 라이브러리파일 -->
                <initializer>com.sample.___Extension</initializer<!-- 패키지명.___Extension 클래스명 -->
            </applicationDeployment>
        </platform>
    </platforms>
</extension>
cs


9. 필요한 경우 platform.xml 파일을 사용하여 플랫폼 별로 추가로 포함되어야 하는 jar 또는 리소스등을 설정할 수도 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<platform xmlns="http://ns.adobe.com/air/extension/21.0"
    <packagedDependencies
        <packagedDependency>android-support-v4.jar</packagedDependency>
    </packagedDependencies
    <packagedResources
        <packagedResource
            <packageName>com.ane.googleplusapi</packageName
            <folderName>res</folderName
        </packagedResource
        <!-- <packagedResource> 
            <packageName>com.android.support</packageName> 
            <folderName>res2</folderName> 
        </packagedResource> -->
    </packagedResources>
</platform>
cs


10. ANT 로 컴파일을 하기 위해 build.xml 을 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8"?>
<project name="Air Native Extension Build Scripts" default="package">
     <property name="name" value="파일명"/>
    <property name="sdk.home" value="AIRSDK경로"/>
    <property name="bin.ext" value=".bat"/<!-- 이건 실행파일 확장자, 윈도우는 .bat, 리눅스 계열은 공백  -->
 
    <target name="package" description="Create the extension package">
        <exec executable="${sdk.home}/bin/adt${bin.ext}" failonerror="true" dir="./">
            <arg value="-package"/>
            <arg value="-target"/>
            <arg value="ane"/>
            <arg value="${name}.ane"/>
            <arg value="./extension.xml"/>
            <arg line="-swc ${name}.swc"/>
            <arg line="-platform iPhone-ARM -platformoptions platform.xml -C /ios용경로 library.swf ios_filename.a"/>
            <arg line="-platform Android-ARM -C /android용경로  library.swf android_filename.jar"/>
            <arg line="-platform default -C /기본용경로 library.swf"/>
        </exec>
    </target>
</project>
 
cs

위 내용중에 library.swf 파일은 아까 각각 만든 SWC 파일에서 풀어놓은 library.swf 를 사용하면 되고.

-C 옵션은 경로를 설정하는 옵션이다.

그리고 메인에 사용되는 ${name}.swc 이 파일은 위에서 만든 swc 아무거나 하나 사용하면 된다.




11. ant 를 실행해서 빌드 (ant 경로는 path로 잡혀있어야 함)

참고로 폴더에는 아래 파일들이 다 있어야 한다. ___ 파일명은 동일하게 하는게 좋음, 아니면 build.xml에서 고칠것

____.jar

____.a

build.xml

extension.xml

library.swf

____.swc


12. IOS 는 맥이 없어 못해봤으니 차후 하게되면 업데이트 하겠음



2015. 8. 28. 18:25

Adobe Scout 사용 시 advanced-telemetry 옵션 관련

Adobe Scout 를 사용하면서 Memory 사용량을 보기 위해서 advanced-telemetry을 설정해야 한다.


Air 를 사용하는 경우 -advanced-telemetry=true 옵션을 컴파일러 옵션에 추가 하면 되지만


SWF파일(flex나 플래시)를 사용하는 경우 옵션이 존재하지 않기 때문에 사용할 수 없다.


하지만 역시나 SWF 파일도 위 Scout 에서 프로파일링 가능하도록 해주는 툴을 만들어 주셨다.


http://renaun.com/blog/2012/12/enable-advanced-telemetry-on-flex-or-old-swfs-with-swf-scount-enabler/


사용법은 간단하다.


air 파일을 다운받아 설치하면 SWFScoutEnabler 라는 프로그램이 설치되는데.


이 파일을 실행하면 입력하는 곳이 두개가 있는데 첫번째는 위 옵션이 설정된 SWF 파일을 생성할떄 이름앞에 붙일 수 있는 접두어 문자를 정하는 것이고 두번째는 비번설정하는거 같은데 신경안써도 된다.


실행을 하고 디버깅을 해서 만들어진 SWF 파일을 SWFScoutEnabler 에 드래그를 하면 앞에 설정한 접두어가 붙은 SWF 파일이 새로 생성된다.


그럼 기존SWF 를 지우고 새로생긴 SWF를 원래 이름으로 바꾼후에 html 페이지에서 로드하게 하면 정상적으로 Scout 에서 메모리 프로파일링이 가능해진다.


혹시나 모르니 air 파일을 여기에도 올려놓겠음.



SWFScoutEnabler.air


2015. 4. 23. 10:02

FreshPlanet 의 ANE-Push-Notification 사용할때 참고

에어 모바일용 푸시알림 확장기능


ane 기능은 훌륭하지만 제작한 곳이 외주?일꺼리를 받는 곳이라 그런지
메뉴얼이나 세부적인 사용방법이 전무하다. 못하겠으면 의뢰를 해라는건지..
그래서 하루종일 헤매다가 알아낸 부분을 정리해 놓겠다.

1. 앱크래쉬 관련
위의 ane 를 적용해서 사용했을때 앱이 크래쉬되면서 종료되는 문제가 발생하였다.
찾아보니 안드로이드 4.4 이상은 android-support-v4.jar 파일이 필요한데 기본으로 포함되지 않아서 생기는 문제라고 하던데.
이를 해결하기 위해서는 android-support-v4.jar 파일을 포함해서 다시 컴파일 하는 방법외에는 없다.

하지만 이 ane 에는 아이폰용 라이브러리도 포함되어 있는데 맥이 없어서 컴파일을 다시 하게되면 아이폰용 기능은 사용 못할 수 밖에 없어서 고민중인 차에 마침 친절한 개발자 분께서 컴파일을 새로 해서 ane 파일을 올려주셨다. 그러니 아래 링크에서 받아서 사용하면 되겠다. 파일이 없어질 수 있으니 여기에도 따로 올리겠음.


AirPushNotification.ane



안드로이드 쪽은 푸시가 왔을때 상태바에 표시될 아이콘이 있어야 하는데 그 아이콘은 ane 파일에 포함되어야 한다.

변경하는 방법은 위의 ane 파일 확장자를 zip 파일로 바꾸고 압축프로그램으로 열기를 해서 이미지를 변경해주면 된다.

이미지는 /META-INF.ANE/Android-ARM/res/drawable-xhdpi 에 존재하니 동일한 크기로 만들어서 변경해주면 된다.

다만!! 절대 압축을 푼후에 다시 압축하면 안된다.(컴파일 할때 ane 파일을 읽어들이지 못함)

압축프로그램으로 열어서 zip 파일에 이미지를 추가하는 방식으로 해야 정상적으로 처리가 된다.


2. 앱실행중 푸시 메세지를 앱내부에서 수신

PushNotificationEvent.NOTIFICATION_RECEIVED_WHEN_IN_FOREGROUND_EVENT

이 이벤트를 사용하면 앱에서 푸시메세지를 받을 수 있을 것처럼 되어 있으나

앱이 실행중이어도 외부(상태바)에 알림이 들어오고 이벤트가 수신이 안되었다.

ane 의 소스(java파일)을 죽어라 뒤진결과 setIsAppInForeground 를 true로 해줘야 수신이 되는걸 알아냈다.


PushNotification.getInstance().setIsAppInForeground(true);


다만 아직까지 백그라운드로 실행중일때 푸시수신을 아래 이벤트로 받는 방법은 찾아내지 못했다.

PushNotificationEvent.APP_STARTED_IN_BACKGROUND_FROM_NOTIFICATION_EVENT


3. 푸시 메세지 클릭 시 앱실행

나와있는 설정대로 사용할 경우 메세지를 클릭하면 메세지가 없어지고 아무런 동작도 하지 않는다.

안드로이드의 제반지식이 없어 좀 헤맷는데.

매니페스트에 아래 부분을 추가하면 메세지 클릭 시 앱이 실행되고 addListenerForStarterNotifications 로 설정된

핸들러로 푸시 메세지를 받을 수 있게 된다.

PushNotification.getInstance().addListenerForStarterNotifications(핸들러)


//매니페스트 추가부분

<activity android:exported="true" android:name="com.freshplanet.nativeExtensions.NotificationActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />


에어로 모바일 앱을 만들던 cocos2d로 만들던 안드로이드와 ios 의 기본적인 정보를 알고 있어야 할듯.


2015. 3. 24. 17:02

[Starling/FeathersUI] ListCollection 정렬

ListCollection은 Feathers UI 의 List 컴포넌트에서 DataProvider 로 사용하는데


정렬기능을 지원해주지 않아 번거로운 점이 있다.


소스를 뜯어보니 실제 데이타는 Object 형태로 저장이 되지만 받아 들이는 데이타 형태는 아래와 같이 6가지 형태이다.


Array

Vector.<Number>

Vector.<int>

Vector.<uint>

Vector.<*>

XMLList


정렬기능을 사용하기 위해 정렬함수를 제공해주는 Array 방식으로 값을 할당한다.

하나의 아이템 값으로 Object 를 할당하는 경우에는 거의 대부분 Array 방식으로 처리가 된다.

var list:ListCollection = new ListCollection([

  {....},

  {....}

]);


list.addItem({....});

list.push({....});


그럼 간단하게 아래처럼 하면 일반 Array 를 사용하는 것 처럼 sortOn 메소드를 이용해서 ListCollection을 정렬할 수 있다.

(list.data as Array).sortOn("Object속성이름");

(list.data as Array).sortOn("Object속성이름", Array.NUMERIC | Array.DESCENDING); //숫자타입으로 desc 정렬

2015. 2. 25. 13:52

Simple encrypt/decrypt(AS3, PHP)

액션스크립트 -------------------------------------------------

package { import com.hurlant.util.Base64; public class Simplecrypt { static public function encrypt(str:String, key:String = '%key&'):String { var result:String = ''; for (var i:int = 0; i < str.length; i++) { var char:String = str.substr(i, 1); var keychar:String = key.substr((i % key.length) - 1, 1); var ordChar:int = char.charCodeAt(0); var ordKeychar:int = keychar.charCodeAt(0); var sum:int = ordChar + ordKeychar; char = String.fromCharCode(sum); result = result + char; } return Base64.encode(result); } static public function decrypt(str:String, key:String = '%key&'):String { var result:String = ''; var str:String = Base64.decode(str); for (var i:int = 0; i < str.length; i++) { var char:String = str.substr(i, 1); var keychar:String = key.substr((i % key.length) - 1, 1); var ordChar:int = char.charCodeAt(0); var ordKeychar:int = keychar.charCodeAt(0); var sum:int = ordChar - ordKeychar; char = String.fromCharCode(sum); result = result + char; } return result; } } }


PHP -------------------------------------------------

<?php class Simplecrypt { public static function encrypt($string, $key='%key&') { $result = ''; for($i=0; $i<strlen($string); $i++) { $char = substr($string, $i, 1); $keychar = substr($key, ($i % strlen($key))-1, 1); $ordChar = ord($char); $ordKeychar = ord($keychar); $sum = $ordChar + $ordKeychar; $char = chr($sum); $result.=$char; } return base64_encode($result); } public static function decrypt($string, $key='%key&') { $result = ''; $string = base64_decode($string); for($i=0; $i<strlen($string); $i++) { $char = substr($string, $i, 1); $keychar = substr($key, ($i % strlen($key))-1, 1); $ordChar = ord($char); $ordKeychar = ord($keychar); $sum = $ordChar - $ordKeychar; $char = chr($sum); $result.=$char; } return $result; } }

출처 : https://cambiatablog.wordpress.com/2010/08/24/simple-encryptdecrypt-in-as3-and-php-base64-blues/

2015. 2. 24. 10:41

이미지를 ATF 파일로 사용할 때 참고

ATF 파일은 플랫폼(GPU)별로 최적화 된 포맷을 제공하기 때문에 사용하기를 권장하며 아래 플랫폼 별로 픽셀포맷을 선택하는 것이 좋다.


  • PVRTC (PowerVR Texture Compression) is used in PowerVR GPUs. It is supported by all generations of theiPhone, iPod Touch, and iPad.
  • ETC (Ericsson Texture Compression) is used in many mobile phones, most notably Android phones.
  • DXT1/5 (S3 Texture Compression) was originally developed by S3 Graphics. It is now supported by both Nvidia and AMD GPUs, and is thus available in most desktop computers, as well as some Android phones.


TexturePacker 를 사용할 경우 아래처럼 Settings 패널에서 설정할 수 있다.





ATF 와 PNG 파일의 성능테스트 참고 페이지

http://wooyaggo.tistory.com/408 - ATF VS PNG 벤치마킹(OS X)

http://wooyaggo.tistory.com/409 - ATF VS PNG 벤치마킹(Android)

http://wooyaggo.tistory.com/411 - ATF 와 PNG 파일의 벤치마킹 결과


2015. 2. 5. 16:59

모바일(앨범)에서 이미지 업로드(CameraRoll사용)

임시파일 생성없이 ByteArray를 바로 전송하는 방식이다.

이 방식을 사용할 경우 받는 쪽에스 RAW_POST_DATA 로 받아줘야 한다.


package utils
{	
	import flash.events.ErrorEvent;
	import flash.events.Event;
	import flash.events.IEventDispatcher;
	import flash.events.IOErrorEvent;
	import flash.events.MediaEvent;
	import flash.media.CameraRoll;
	import flash.media.MediaPromise;
	import flash.net.URLLoader;
	import flash.net.URLLoaderDataFormat;
	import flash.net.URLRequest;
	import flash.net.URLRequestMethod;
	import flash.utils.ByteArray;
	import flash.utils.IDataInput;

	public class ImageSelector
	{
		private var cr:CameraRoll;
		private var dataSource:IDataInput;
		private var eventSource:IEventDispatcher;
		private var loader:URLLoader;
		private var filename:String;
		
		public function ImageSelector()
		{
			cr = new CameraRoll();
		}
		
		public function uploadImage():void
		{
			if(!CameraRoll.supportsBrowseForImage)
				return;
			
			cr.addEventListener(MediaEvent.SELECT, onImageSelect);
			cr.addEventListener(Event.CANCEL, onBrowseCancel);
			cr.addEventListener(ErrorEvent.ERROR, onMediaError);
			cr.browseForImage();
		}
		
		private function onImageSelect(e:MediaEvent):void
		{
			var imagePromise:MediaPromise = e.data;
			dataSource = imagePromise.open();
			filename = imagePromise.relativePath;
			
			if(imagePromise.isAsync)
			{
				eventSource = dataSource as IEventDispatcher;
				eventSource.addEventListener(Event.COMPLETE, onMediaLoaded);
			}
			else
			{
				readMediaData();
			}
		}
		
		private function onMediaLoaded(e:Event):void
		{
			eventSource.removeEventListener(Event.COMPLETE, onMediaLoaded);
			readMediaData();
		}
		
		private function readMediaData():void
		{
			var imageBytes:ByteArray = new ByteArray();
			dataSource.readBytes(imageBytes);
			
			loader = new URLLoader();
			loader.dataFormat = URLLoaderDataFormat.BINARY;
			
			var urlString:String = "http://업로드경로.php?filename=" + filename;
			var request:URLRequest = new URLRequest(urlString);
			
			request.data = imageBytes;
			request.method = URLRequestMethod.POST;
			request.contentType = "application/octet-stream";
			loader.addEventListener(Event.COMPLETE, onUploadComplete);
			loader.addEventListener(IOErrorEvent.IO_ERROR, onUploadError);
			loader.load(request);
		}
		
		private function onUploadComplete(e:Event):void
		{
			disposeAll();
		}
		
		private function onUploadError(e:IOErrorEvent):void
		{
			disposeAll();
		}
		
		private function onBrowseCancel(e:Event):void
		{
			disposeCameraRoll();
		}
		
		private function onMediaError(e:ErrorEvent):void
		{
			disposeCameraRoll();
		}
		
		private function disposeCameraRoll():void
		{
			cr.removeEventListener(MediaEvent.SELECT, onImageSelect);
			cr.removeEventListener(Event.CANCEL, onBrowseCancel);
			cr.removeEventListener(ErrorEvent.ERROR, onMediaError);
		}
		
		private function disposeAll():void
		{
			disposeCameraRoll();
			
			loader.removeEventListener(Event.COMPLETE, onUploadComplete);
			loader.removeEventListener(IOErrorEvent.IO_ERROR, onUploadError);
		}
	}
}



받는쪽 ---------------------------------------------------------------------


if($GLOBALS['HTTP_RAW_POST_DATA']) { $filename = $_GET['filename']; //방법1. 파일로 저장 $fp = fopen('경로'.$filename, 'wb+'); fwrite($fp, $GLOBALS['HTTP_RAW_POST_DATA']); fclose($fp); //방법2. 임시파일로 생성후 사용(GD로 변환작업등 원본이 불필요한 경우) $tmpname = tempnam(sys_get_temp_dir(), 'pic'); $fp = fopen($tmpname, 'wb+'); fwrite($fp, $GLOBALS['HTTP_RAW_POST_DATA']); fclose($fp); @unlink($tmpname); }