AIR 는 설치형 어플리케이션입니다.

이제 AIR 개발도 소프트웨어 개발이라고 감히 불러도 될것 같다는 개인적인 생각이 드네요.

그래서 실제 서비스에 필요한 완성도 높은 어플리케이션을 만들려면

어떤 디테일이 필요한지 한번 예를 들어보겠습니다.



1. Install Path.

내 어플리케이션이 어디에 설치가 될 것인지

분명하게 지정을 해줘야합니다.

단일 소프트웨어면 C:\Program Files\ 로 잡아야겠지만

저 같은 경우는 제 어플리케이션은 실험적인 것들이 많기 때문에

C:\Program Files\Wooyaggo Applications\ 폴더에 몰아 넣습니다.

사용자 삽입 이미지

프로그램 폴더도 패키지 처럼 용도와 목적에 맞게 구분되는거 더 편의성있지 않을까 싶네요^^

그리고 현재 설치된 폴더의 한단계 위 폴더를 검색하면

현재 설치되어 있는 어플리케이션의 목록도 알아볼 수 있으니까 나름 장점도 있을거 같습니다.



2. Icon.

AIR 에는 총 3가지 아이콘 종류가 있습니다.

 - Application Icon

사용자 삽입 이미지

Application Icon 은 실행파일의 아이콘, 단축아이콘, Task Bar 에서의 아이콘,

타이틀 창의 아이콘으로 사용됩니다.



 - SystemTray Icon

사용자 삽입 이미지

시스템 트레이 아이콘은 단순히 보여주기 용이 아니라

클릭 이벤트나 마우스 이벤트를 받을 수 있습니다.

특히 우클릭 메뉴를 따로 지정할 수 있기 때문에

보다 편리한 LUI를 위해서 가능하다면 꼭 신경쓰는 것이 좋습니다.



 - File Icon

사용자 삽입 이미지

AIR 는 특정 파일에 대해서

기본 실행 프로그램으로 지정할 수 있습니다.

그렇기 때문에 지원하는 파일의 경우 설정된 아이콘으로 보여질 수 있죠.

보이는 예는 SecretFile 의 파일 포맷인 *.secret 의 파일 아이콘입니다.



3. Window Drag, Resize, Close, Minimize.

네이트온 메신져를 보면 이해가 쉽습니다.

대화창을 드래그 하고 싶을땐 상단을 잡아 끄는 행동을 하게 되고

창의 크기를 늘리고 싶으면 자연스럽게 테두리에 마우스를 가져가죠.

창을 닫고 싶을땐 우측 상단에 X 표시를 찾게 되고

끄지는 않지만 숨겨놓고 싶을땐 마찬가지로 우측 상단에서 _ 표시를 찾게 됩니다.

이 모든게 대부분의 유저들이 자연스러운 멘탈 모델을 따르는 것이라고 볼 수 있습니다.

이러한 자연스러운 멘탈 모델은 거스르지 않는게 좋은 UX 가 되겠죠.

하지만 NativeWindow.startDrag() 나 NativeApplication.exit(), NativeWindow.minimize()

등은 이미 쉽게 제공이 되고 있지만

정작 까다로운 부분은 Resize 부분입니다.

물론 NativeWindow.startResize( edgeOrCornet ) 라고 제공을 하지만

문제는 잡고 드래그할 영역을 만들어주고

Resize 에 맞게 재위치 시켜주는것이 까다롭습니다.

그래서 시간날때 꼭 컴퍼넌트화 시켜놓는것이 좋을 것 같습니다.

앞으로는 기본적으로 마우스의 커서를 기본 커서들로 바꿀 수 있다고 하니 더 쉬워질듯 합니다.



4. 마지막 위치, 창 크기를 기억해놓자.

창을 리사이즈 시키거나 드래그를 할 경우

다시 어플리케이션을 띄우면 예상하지 못한 위치에서 뜨게 될 경우

유저는 불편함을 느낄지도 모릅니다.

왠지 손에 익은 툴이 아니라 매번 포장지를 새로 뜯어 사용하는 기분이 들지도 모르죠.

AIR 에서는 EncryptedLocalStore 라는 static 클래스를 제공합니다.

하나의 어플리케이션당 기본으로 제공하는 저장 공간인데요.

"AIR Cookie"라고 부를 수 있겠습니다.

하지만 용량이 매우 크고 저장포맷이 ByteArray 이기 때문에

다루기는 쉽지 않지만 그만큼 활용할 수 있는 방법도 많고

가능성 또한 매우 무궁무진합니다.

로직은 아래와 같이 되겠죠.

 - 초기화

1. EncryptedLocalStore 뒤져서 저장되어 있는 값 있는지 확인.

2-1. 있으면 초기값 적용하고 EncrpytedLocalStore 제거.

2-2. 없으면 기본값 적용.

 - 어플리케이션 닫을때( NativeWindow.addEventListener( Event.CLOSE, function ) )

1. ByteArray 생성.

2. 창위치 저장.

3. 창크기 저장.

4. EncryptedLocalStore 에 저장.

이런식으로 구현되면 되겠습니다.



5. 우클릭 메뉴를 적극적으로 활용하자.

이부분은 강조하기 조금 불안한 부분인데

그 이유는 곧 AIR 새 버젼이 나오면

ContextMenu 와 NativeMenu 가 대폭 향상된다고 합니다.

지금은 단순히 String 형만 되지만

다양한 표현방법을 제공하고 많이 개선될거라고 하더군요.

머 어쨌든 길을 가는 방법이야 어쨌든 어떤 길이 있는지는 살펴봐야겠죠.



 - NativeWindow.menu

이 메뉴는 Chrome 창 하단에 나오는 기본 메뉴입니다.
사용자 삽입 이미지

Chromless 가 아니라면 꼭 신경써야할 부분임에 틀림 없습니다.



 - Right Menu.

사용자 삽입 이미지

this.stage.addEventListener( MouseEvent.RIGHT_CLICK, rightClickListener );

이벤트를 받아서

NativeMenu.display( stage, x, y );

로 표시해줄 수 있다.



 - SystemTray Menu
사용자 삽입 이미지
InteractiveIcon.menu 속성을 이용하면

쉽게 우클릭메뉴를 설정할 수 있습니다.







위 5가지 디테일만 우리가 잘 생각해주면

기본적으로 완성도가 높은 어플리케이션으로 포장할 수 있을 것이다.

개발자적 도전정신은 매우 중요한 요소지만

실제 사용할 유저에게 GUI 뿐만이 아니라 경험이나 편의에 따른 LUI(Logical User Interface) 를 제공하는것도 무시할 수 없는 점일 것이다.


p.s) AIR 한달 넘게 못하고 있는 야꼬였습니다. -_ㅜ


이올린에 북마크하기(0) 이올린에 추천하기(0)

Tag : AIR, Tip & Tech

[AIR] AIR runtime 자동 업데이트 비활성화

Posted 2008/03/17 23:05 by wooyaggo
article : http://kb.adobe.com/selfservice/viewContent.do?externalId=kb403175&sliceId=2

air : http://airdownload.adobe.com/air/applications/SettingsManager/SettingsManager.air

사용자 삽입 이미지

AIR Runtime 의 자동업데이트 기능을 비활성화 시킬 수 있습니다.

p.s) 베타때 나왔으면 오죽 좋아 -_ㅡ+

암튼 나중에 필요하면 찾아와서 사용하세요^^

Tag : AIR, Update

[강좌] 허프만 알고리즘

Posted 2008/02/01 18:02 by wooyaggo
이것 저것 공부하다가

흘러흘러가서 결국은 허프만 코드까지 공부하는 지경에 이르렀다.

전기과 출신(게다가 자퇴)에 디자이너 출신인 내 배경을 생각해보면

정말 장족의 발전이 아닐 수 없다. 허허...

아무튼 압축알고리즘의 가장 인기있는 알고리즘이 아닌가 한다.

MPEG 의 기본 압축 알고리즘으로도 쓰이고 있고

우리가 자주 사용하는 알집 역시 허프만 알고리즘으로 한번 압축한후

Lempel 이라는 간단한 압축알고리즘으로 한번 더 압축하는 프로세스라고 하니

허프만 알고리즘은 그 효율을 인정받고 있는듯 하다.



머 알고리즘이라고 해서

엄청 복잡한 줄 알았던 본인이지만

호프만 알고리즘을 보고 나서는

정말 무릎을 탁~ 치는 그런 느낌이었다.

다른 동영상 알고리즘이나 음향 알고리즘은

무슨 주파수에 양자화니 빈도수 머 어쩌구 저쩌구...

먼말인지 하나도 모르겠지만

호프만 알고리즘의 핵심은 두가지로 설명할 수 있다.



1. 이론

자주 쓰이는 문자에 가장 작은 bit 를 할당하고

한두번 쓰이는 문자에는 큰 bit 를 할당한다라는 것이다.

즉 간단하게 예를 들어서

AABBAC

라는 문자열이 있다고 예를 들어보자.

영문자 하나는 1byte 이므로 총 6byte 의 크기를 가지는 문자열이다.

자 그럼

각 문자들이 사용된 횟수를 알아보자.

머 짧으니까 한눈에 알 수 있을 것이다.

A 는 3번

B 는 2번

C 는 1번 사용되었다.

그러면 가장 많이 사용된 A 에게 0 이라는 1bit 를 부여하고

B 는 10, C 는 11 을 부여할 수 있다.

그러면 위 문자열은

A(0)A(0)B(10)B(10)A(0)C(11)

합쳐보면 001010011 로 나타낼 수 있다.

총 9 bit = 1 byte + 1 bit 으로 압축을 할 수 있다.

원래 문자열이 6 byte 즉 48 bit 를 차지하였는데 9/48 = 0.19

즉 약 20% 로 압축이 되었다. 압축률이 80% 라는 이야기다.

뭐 조금 띄엄띄엄 살펴본것 같지만 허프만 알고리즘의 핵심은 바로 이것이다.

물론 헤더도 붙고 하다보면 조금더 커지겠지만

큰 파일일 수록, 텍스트 기반일 수록, 자주 쓰이는 문자가 많을 수록 압축률은 높아지게 되어 있다.



2. 이진 트리

자 그렇다면 이론은 알겠는데

실제로는 어떻게 적용해야하는 걸까?

순서대로 한번 살펴보자.

대상 문자열 : CDDCACBCBCCCBBCDA

1. 각 문자열별로 빈도수를 검사한다.

사용자 삽입 이미지





2. 빈도수 순서대로 정렬한다. (repeat 1/2)

사용자 삽입 이미지





3. 가장 낮은 두 그룹을 묶어서 하나의 그룹으로 만든다. (repeat 2/2)

사용자 삽입 이미지








4. 빈도수 순서대로 정렬한다. (repeat 1/2)

사용자 삽입 이미지








5. 가장 낮은 두 그룹을 묶어서 하나의 그룹으로 만든다. (repeat 2/2)

사용자 삽입 이미지










6. 빈도수 순서대로 정렬한다. (repeat 1/2)

사용자 삽입 이미지










7. 가장 낮은 두 그룹을 묶어서 하나의 그룹으로 만든다. (repeat 2/2) 트리완성.

사용자 삽입 이미지













8. 이제 트리가 완성되었다.

가장 윗 트리에서부터 빈도수가 큰 트리에 0을 작은 트리에 1을 부여한다.

사용자 삽입 이미지













9. 위 트리를 기준으로 각 문자열의 비트를 참조한다.

부모노드에서 출발하여 문자열에 다다를때까지 비트를 더하여 참조한다. 즉,

사용자 삽입 이미지













A - 001 이 된다.

이와 같은 방법으로

B - 01, C - 1, D - 000 로 비트를 할당 할 수 있게 된다.

그러면 초기 문자열을 할당된 비트로 치환하여 보자.

1000000100110110111101011000001

위와 같이 치환되었다.

총 17문자, 17 byte 였던 원래 문자열이 31 bit 즉, 8 byte 로 압축이 된것이다.

물론 문자열 테이블도 붙고 헤더도 붙으면 약간 더 늘어나겠지만

이번 테스트에서의 압축률은 약 50%로 나타났다.



3. 디코딩은?

호프만 알고리즘을 이용하여 압축을 하면

어떤 문자가 어떤 bit 로 치환되었는지를 판단해야되기 때문에

호프만 테이블이라고 불리는 테이블을 추가해야한다.

호프만 테이블은 방금 우리가 만든 그 이진 트리를 말한다.

그 트리를 보고 복호화하는것이다.

사용자 삽입 이미지












한 bit 단위로 읽어서 테이블대로

문자가 나올때까지 트리를 타고 가면서 치환하는것이다.

예를 들어 00101 이라는 데이타는

AB 를 나타낸다는 것이다.

 - 00101 을 복호화해보자

 - 첫 비트 0 은 17로 표시되어 있는 트리에서 왼쪽, 즉 9 로 표시되어 있는 트리로 내려간다.
 - 다음 0 은 역시 왼쪽, 5 로 표시되어 있는 트리로 내려간다.
 - 다음 1 비트는 오른쪽, 즉 2로 표시되어 있는 트리, A 를 나타낸다.
 - 문자를 하나 찾았으니 자 그럼 다시 처음부터
 - 다음 0 은 17 트리에서 9 트리로
 - 다음 1 은 오른쪽 4 트리로, 즉 B 를 나타낸다.

이런식으로 문자열을 치환해주면된다.

대단하지 않은가??

이게 바로 허프만 알고리즘의 원리인것이다.

곧 허프만 알고리즘을 이용한 압축 어플리케이션을 AIR 로 만들어서 올릴 생각이다.

일반 상용 프로그램에 견줄바는 안되겠지만

나름 장점이 있다면 아무도 못 푸는 나만의 압축 파일을 만들수 있다는것 정도??

^^ 많이 기대해주시라~

Tag : huffman, 알고리즘, 압축알고리즘, 허프만

[AIR 강좌] XML 파일 만들고 저장하기 2부.

Posted 2007/10/31 14:17 by wooyaggo

자 바로 소스 들어갑니다.

소스를 먼저 보고 한줄 한줄 어떤 기능인지 분석을 해보겠습니다.

package {
     import flash.display.MovieClip;
     import flash.display.Sprite;
     import flash.events.Event;
     import flash.events.MouseEvent;
     import flash.filesystem.File;
     import flash.filesystem.FileMode;
     import flash.filesystem.FileStream;
     import flash.net.URLRequest;
     import flash.text.TextField;
     import flash.utils.ByteArray;

     public class XMLCreator extends Sprite
     {
          public var txtXML: TextField, btnCreate: MovieClip;
         
          public function XMLCreator()
          {
               this.btnCreate.buttonMode = true;
               this.btnCreate.addEventListener( MouseEvent.CLICK, onCreate );
          }
         
          private var data: ByteArray
          private function onCreate( e: MouseEvent ): void
          {
               var str: String = this.getText();
              
               this.data = this.getBinary( str );
              
               this.file = this.createFile();
               this.file.download( new URLRequest( "http://www.noexistdomain.com" ), "default.xml" );
          }
         
          private var file: File
          private function onSelect( e: Event ): void
          {
               this.saveData();
          }
         
          private var fileStream: FileStream;
          private function saveData(): void
          {
               this.file.cancel();
              
               this.fileStream = new FileStream();
               this.fileStream.open( this.file, FileMode.WRITE );
               this.fileStream.writeBytes( this.data, 0, this.data.bytesAvailable );
               this.fileStream.close();
          }
         
          private function getText(): String
          {
               var str: String = this.txtXML.text;
              
               try
               {
                    XML( str );
               }
               catch( e: TypeError )
               {
                    throw new Error( "작성한 텍스트는 XML 형식이 아닙니다." );
               }
              
               return str;
          }
         
          private function getBinary( str: String ): ByteArray
          {
               var ba: ByteArray = new ByteArray();
               ba.writeMultiByte( str, "utf-8" );
              
               return ba;
          }
         
          private function createFile(): File
          {
               var file: File = new File();
               file.addEventListener( Event.SELECT, onSelect );
              
               return file;
          }
     }
}


UML 대로 이쁘게 나온거 같습니다.

자 그럼 메소드단위로 하나씩 분석해보겠습니다.

          public function XMLCreator()
          {
               this.btnCreate.buttonMode = true;
               this.btnCreate.addEventListener( MouseEvent.CLICK, onCreate );
          }

초기화 생성자 메소드에서는 버튼에 롤오버 효과를 내는 buttonMode 를 설정해주고

MouseEvent.CLICK 이벤트를 받도록 걸어줬습니다.

          private var data: ByteArray
          private function onCreate( e: MouseEvent ): void
          {
               var str: String = this.getText();
              
               this.data = this.getBinary( str );
              
               this.file = this.createFile();
               this.file.download( new URLRequest( "http://www.noexistdomain.com" ), "default.xml" );
          }

onCreate 메소드는 getText() 메소드를 통해 저장할 값을 가져오고

getBinary() 메소드를 통해서 바이너리로 변환합니다.

그리고 저장위치를 선택하기 위해서 file 객체를 생성한후

선택하는 브라우져를 띄웁니다.

Tip )

File 클래스에는 browse 관련된 메소드가 많은데 왜 굳이 download 라는 편법을 쓰는가?

AIR Beta 1 때 쓰던 방법인데

현재 Beta 2 에서는 browse 관련된 메소드가 많이 추가되었습니다.

근데 정작 browseForSave() 메소드에는 파일명을 설정하는 옵션이 없습니다.

파일명은 커녕 FileFilter 클래스조차 없죠.

단지 브라우져에 title 정하는 기능뿐입니다.

그래서 파일명을 정해주기 위해서 download 를 쓰게 된 것입니다.

onSelect 는 맨 마지막에 살펴보고

getText 와 getBinary 메소드를 살펴보겠습니다.

          private function getText(): String
          {
               var str: String = this.txtXML.text;
              
               try
               {
                    XML( str );
               }
               catch( e: TypeError )
               {
                    throw new Error( "작성한 텍스트는 XML 형식이 아닙니다." );
               }
              
               return str;
          }

단순히 텍스트만 가져오는 메소드인줄 알았는데

그 무섭다는 try catch 형제까지 동원됐군요.

이 이유는 우리가 저장할 XML의 형식을 유지해야하기 때문입니다.

XMLCreator 기 때문에 XML 형식인지 아닌지를 체크할 필요가 있습니다.

가장 좋은 방법이 플래시 자체적으로 XML 을 판단하는 룰을 이용하는것이죠.

즉 str 을 XML 로 변환시켜보고

이상이 없으면 투고 쓰리고 가는것이고

이상이 있으면 에러를 발생시키고 중단하는 것입니다.

즉 getText 라는 메소드는 텍스트를 가져오되 XML 에 맞는 텍스트만 돌려준다는 역할이 생긴것이죠.

          private function getBinary( str: String ): ByteArray
          {
               var ba: ByteArray = new ByteArray();
               ba.writeMultiByte( str, "utf-8" );
              
               return ba;
          }

뭐 없습니다.

ByteArray 클래스 하나 만들어주고 텍스트를 우리가 메모장같은데서 열어볼 수 있도록 UTF-8 로 저장해주는 것입니다.

따로 지정하지 않으면 한글은 모두 정보를 잃게됩니다.



자 그리고 파일을 선택하고 나서의 프로세스입니다.

          private var file: File
          private function onSelect( e: Event ): void
          {
               this.saveData();
          }

saveData 에 패스 ㄱㄱ

          private var fileStream: FileStream;
          private function saveData(): void
          {
               this.file.cancel();
              
               this.fileStream = new FileStream();
               this.fileStream.open( this.file, FileMode.WRITE );
               this.fileStream.writeBytes( this.data, 0, this.data.bytesAvailable );
               this.fileStream.close();
          }

우선 다운로드는 그저 경로만 지정받기 위한 용도기 때문에

cancel 로 중지시켜줍니다.

그리고 로컬에 파일을 저장시켜줄 FileStream 객체를 생성합니다.

그리고 파일을 생성하여 저장할 준비를 합니다.

FileStream.open 메소드는 file:File, fileMode:String 파라미터를 요구합니다.

Tip) open 과 openAsync 메소드의 차이는?

기존에 C 나 자바를 다뤄보신분은 아실텐데

우리가 파일을 생성할때는 어느정도 시간이 걸립니다.

이때 open 메소드는 파일을 생성하는 작업이 끝날때까지 프로세스를 멈춰놓는 기능이고

openAsync 메소드는 파일을 생성하는 작업을 걸어놓고 다음 프로세스로 넘어가는 기능입니다.

만약 위에서 open 대신 openAsync 메소드를 사용한다면

write 메소드는 딜레이를 기다렸다가 실행되어야 합니다.

안그럼 파일도 없는데 맨땅에 write 한다고 에러가 발생합니다.

Async 메소드는 open 말고도 많은데 차이점을 잘 파악해두시기 바랍니다.

이렇게 파일을 생성한 후

ByteArray 객체를 0, 즉 처음부터 data.bytesAvailable, 즉 끝까지 write 해줍니다.

걍 data 를 그대로 쓴다고 생각하심 편합니다.

그리고 작업이 완료됐으니 FileStream 을 닫아줍니다.


사용자 삽입 이미지

참 쉽죠~? (밥아저씨 왈)

자 이제 Ctrl + Enter 또는 Ctrl + Shift + Enter 로 테스트를 해볼 수 있습니다.

그럼 마지막 남은 부분은 AIR 파일로 최종 컴파일 하는 작업이 남았네요.

AIR 로 컴파일 하는 작업은

메뉴바 > Commands > AIR - Create AIR File. 메뉴를 선택하면 됩니다.

하지만!

처음에 하면 아마 뭐라 뭐라 그러면서 안될겁니다.



AIR 는 데스크탑 어플리케이션이니만큼 보안이 매우 철저합니다

하지만 그렇다고 모든 기능을 다 막아놓은 AS3 Security Model 같지는 않습니다.

다만 인증을 해야하는것인데요

인증에는 공인인증 (은행의 그것이 아닙니다 ㅎㅎ) 과 개인인증 두가지가 존재합니다.

저도 공인인증을 받고 싶어서 나름 설레발이 쳐봤는데

사이트도 죄다 영어고 가격도 500불정도로 비싼편이어서 걍 개인인증으로 지내기로 했습니다.

개인 인증 받기 :

Create AIR File 위 메뉴인 AIR - Application & Installer Settings 메뉴에 들어가면

AIR 파일에 대한 여러가지 정보를 설정할 수 있습니다.

이곳에서 중간아래쯤 보면

Digital signature 라는 디지털 서명이라는 메뉴가 있습니다.

여기서 Change 버튼을 클릭해서 팝업이 뜨면

기존에 만들어 놨으면 찾아서 비밀번호 치면 되고

없으면 Create 버튼을 클릭해서 몇가지 필요한 정보를 입력하고 발급받으면 됩니다.

따로 인증받는 부분이 없기 때문에 만들기는 매우 쉬운편입니다.

자 그럼 개인인증을 받았으니

AIR 셋팅을 하나씩 하나씩 살펴보겠습니다.

사용자 삽입 이미지

 File name 이나 Name, ID 는 굳이 건드리실 필요 없습니다.

Package 의 이름은 해당 프로젝트의 폴더명으로 고정되어 있습니다.

그리고 Version은 해당 어플리케이션의 버젼을 명시합니다.

단순히 설치할때만 필요한게 아니라

Updater 클래스를 이용해서 자체 업데이트를 할때도 이 버젼을 비교해서 설치합니다.

Description 은 설치할때 어플리케이션의 설명글을 달아줄수 있습니다.

(근데 걍 한줄로 쭈욱~ 적어야합니다. 줄바꿈도 안되고 한글도 안되고 암튼 좀 그래요;;)

Copyright 는 업체면 해당 카피문구를 넣으시면 됩니다.

그리고 AIR 의 가장 아름다운 기능중에 하나인

크롬창 기능입니다.

System Chrome : OS 의 창 형식을 그대로 따릅니다.

Custom Chrome (opaque) : OS 의 창을 사용하지 않습니다.

Custom Chrome (transparent) : OS 의 창을 사용하지도 않고 배경색을 투명합니다.

Custom Chrome을 이용하여 다채로운 AIR 를 만들 수 있습니다.

동그란 어플, 바탕화면을 돌아다니는 어플등 배경이 투명하기 때문에 디자인의 폭이 매우 넓습니다.

그리고 어플리케이션의 Icon 을 설정해줄 수 있습니다.

사이즈는 각각 128, 48, 32, 16 입니다.

Beta 1 때는 jpg, bmp, png 를 지원했는데

Beta 2 와서는 png 만 지원하게 됐습니다.

그리고 만약 기존의 Flex 처럼 어플리케이션 설정 파일을 따로 가지고 있으면

Application descripter file settings 에서 설정해주면 되는데 머 이걸 손댈날이 있을지 의문이네요.

그리고 Program menu folder 는 시작메뉴 > 프로그램 > Adobe > Adobe Photoshop 처럼

Adobe 라는 메뉴 폴더를 지정할 수 있습니다.

제품군을 형성할 수도 있다는 이야기겠죠^^

그리고 Destination Folder 는 기본값으로 두시는게 좋을겁니다.

아무래도 컴파일러로 돌리다보니 절대경로가 필요해서 폴더가 변경될 경우를 위해서 메뉴를 둔것 같습니다.

Include File 에는 Flex 의 Assets 처럼 여러가지 필요한 파일들을 포함할 수 있습니다.



휴~

이렇게 여러 설정을 해주고 AIR 파일을 생성 할 수 있습니다.

보통 간단하게

크롬창과 Icon, Digital sign 만 해줘도 무리 없습니다.

모두 설정해준 후에

Publish AIR File 메뉴를 클릭하면

"AIR fle has been created." 라는 문구를 보실 수 있습니다.

그러면 Destination Folder 에 air 파일이 이쁘게 누워있는 것을 보실 수 있습니다.



[ 소스 다운 받기 ]


그럼 다음 강좌를 기약하며 ㅂㅂ2~

ps) 도움되셨으면 리플 고고 ↓

Tag : 3.0, AIR, as3, flash, XMLCreator, 아폴로, 에어, 플래시

[AIR 강좌] XML 파일 만들고 저장하기 1부.

Posted 2007/10/31 13:36 by wooyaggo
이번 강좌에서는

AIR 를 이용해서 XML 문서를 작성하고

로컬에 그 파일을 저장하는 방법을 알아보겠습니다.

첫 강좌고 단순한 기능임에도 불구하고 꽤 어렵고 복잡한 기능이 많이 들어갈 것입니다.

많은 기능이 지원되는 만큼 그 컨트롤 또한 쉽지는 않은게 바로 AIR 입니다.

그리고 파일 저장기능이 매우 흥미로운 기능이기 때문에

유용한 예제가 되지 않을까 합니다.

자 그럼 바로 ㄱㄱ



 * 개발환경

 - Flex 3 Beta 2 [ Flex 3 Beta 2 다운받기 ]

 - Flash CS3 ( AIR Beta2 update 된 버젼 ) [ AIR update for Flash CS3 ]



우선 Flex 에 프로젝트를 생성합니다.

1. File > New > Flex Project 를 선택하여

Application type 을 기본으로 선택되어 있는 Web application 이 아니라

우리는 AIR 를 개발할것이기 때문에

Desktop application 을 선택합니다.

그리고 프로젝트 명을 XMLCreator 로 하고 저장할 폴더를 선택합니다.

2. output 폴더는 그대로 두고 next

3. 이곳에서 두가지를 고쳐야합니다.

사용자 삽입 이미지

Main source folder 를 src 가 아니라 기본 폴더로 지정합니다. 걍 다 지우시면 되요.

그리고 Main application file 을 mxml 이 아니라 우리가 Document Class 로 사용할

XMLCreator.as 로 지정해줍니다.

그런후에 Finish.

사용자 삽입 이미지

그러면 위와 같이 프로젝트가 생성된것을 볼 수 있을겁니다.

(screenshots 폴더는 이 스샷을 찍기위해 제가 만든 폴더에요^^)


플렉스는 이제 셋팅이 끝났습니다.


AIR 버젼으로 업데이트를 한후 플래시를 켜면 Start-up 페이지에서

Flash File (Aodbe AIR) 라는 메뉴가 생긴것을 볼 수 있습니다.

사용자 삽입 이미지

자 주저없이 선택해서 새로운 AIR 파일을 생성합니다.

사용자 삽입 이미지

그런 다음 사이즈는 400x300, FPS 는 60, Documents Class 는 XMLCreator 라고 정해줍니다.

그런 다음 저장~ 아까 플렉스에서 생성한 폴더에 만들어서 넣어주세요.

그러면 이제 기본설정은 다 끝났습니다.

이제 실제 개발만 남았습니다.

일단 확인을 하기 위해서

플렉스로 돌아가서 XMLCreator.as 파일에

trace 를 찍어보겠습니다.

package {
     import flash.display.Sprite;

     public class XMLCreator extends Sprite
     {
          public function XMLCreator()
          {
               trace( "A" );
          }
     }
}

소스는 위와 같습니다.

그리고 플래시로 돌아가서

Ctrl + Shift + Enter 로 Debug Mode 로 컴파일합니다.

( * 그냥 Ctrl + Enter 는 trace 가 찍히지 않습니다. 반드시 디버깅 모드로 보셔야 돼요. )

사용자 삽입 이미지

그러면 output 창에 A 가 찍힌것을 볼 수 있으면

모두 제대로 동작한다는 이야기 입니다.

본격적인 코딩에 앞서서

UI 를 먼저 간단하게 꾸며보겠습니다.

사용자 삽입 이미지

너무 간단한가요 -_-?

멋진 UI 는 여러분의 몫이에요~ (뭐야 이멘트는;;;)



쿨럭 암튼... 각 객체의 정보는 아래와 같습니다.

사용자 삽입 이미지

우리가 public 으로 선언해줘야할 객체는 static textfield 를 제외한 txtXML 과 btnCreate 겠네요.

( * Ctrl + Shift + F12 > Flash > ActionScript Version > Settings > Stage > Automatically declare stage instances 메뉴는 체크해제되어 있어야합니다. )

자 아래와 같이 소스를 추가해봅시다.

package {
     import flash.display.MovieClip;
     import flash.display.Sprite;
     import flash.text.TextField;

     public class XMLCreator extends Sprite
     {
          public var txtXML: TextField, btnCreate: MovieClip;
         
          public function XMLCreator()
          {
              
          }
     }
}

자 이제 준비는 다 됐습니다.

본격적인 구조를 말씀드리겠습니다.

간단한 UML 갑니다.

사용자 삽입 이미지

잘 안보이네요 클릭해서보세요^^

아래는 메소드로 정리된 UML 입니다.

사용자 삽입 이미지

다음 파트에서는 시퀀스 대로 개발을 시작하도록 하겠습니다.

기대해주세요^^*

여기까지의 반복이 앞으로 AIR 를 만드는 기본 작업이 됩니다.

Flex 에 플젝 만들고 Flash 에 플젝 만들고

D.C 생성해주고 테스트하는.



이처럼 작은 플젝에는 UML 까지 그릴필요는 없지만

처음부터 끝까지의 일관성을 유지하기 위해

그리고 개발 중간의 잡음을 없애기 위해서 UML 은 필수입니다.

물론 저도 그리는게 귀찮지만 시간대비 효율이 큰 프로젝트에는 기꺼이 감수해야하는 부분입니다.

그럼 다음 파트쓰기위해 저는 ㄱㄱ


Tag : 3.0, AIR, as3, flash, XMLCreator, 아폴로, 에어, 플래시

[AIR] NativeWindow 띄우기

Posted 2007/08/28 12:51 by wooyaggo

NativeWindow 클래스를 이용해서

새로운 윈도우를 띄울 수 있다.

이를 이용하면 포토샵이나 플래시처럼 각자의 창이 나뉘어진 소프트웨어를 만들 수 있다는 희망을 준다.

그러나 아쉬운 점이 있다면 기본 창에 종속되어 띄운다거나

시스템트레이를 이용한다거나의 기능이 아직 지원되지 않습니다.

즉, 윈도우를 띄우는대로 시작메뉴에 창이 하나씩 늘어난다는 점이죠.

그나마 다행인건 서로 윈도우를 제어할 수 있어서 한번에 다 닫을수는 있지만

아쉽긴 아쉬운 점입니다.

자 그럼 간단하게 윈도우 띄우는 법을 알아볼까요?

소스 보기

NativeWindow(visible:Boolean, initOption:NativeWindowInitOptions)

위와 같이 사용합니다.

visible 은 말그대로 현재 보일것이냐 안보일 것이냐 를 나타내는 것이죠.

initOption 은 띄울 창의 초기 상태를 설정하는 오브젝트죠.

크롬창의 스타일, 배경 투명화, 타이틀등을 설정하죠.

저렇게 되면 하나의 Application Window 를 하나 생성하게 되었습니다.

자 근데 여기서 문제가 하나 있죠.

새로 띄운 윈도우는 DisplayObjectContainer 를 상속하지 않아서

addChild 를 쓸 수가 없습니다.

여기서 반드시 알아둬야할 것은

얼마전 DisplayObjectContainer 강좌에서도 알려드렸다시피

어플리케이션의 가장 위 요소는 Stage 입니다.

하얀 화면을 우리는 Stage 라고 이해를 했었죠.

여기서 새로운 어플리케이션이 생성되었고 거기에는 새로운 하얀 화면이 나타났죠.

새로운 Stage 가 생긴겁니다.

window.stage.addChild() 메소드를 이용하면 새롭게 띄운 창을 마음대로 조절 할 수 있습니다.

새로운 창으로는 무엇을 만들수 있을까요? 행복한 고민입니다^^


 

Tag : 3.0, AIR, 강좌, 아폴로, 에어

[AIR강좌] Drag & Drop 다루기

Posted 2007/08/27 17:27 by wooyaggo
AIR 의 드래그 앤 드랍 (이하 D&D) 은 윈도우 API 와 같이 사용할 수 있다.

예를 들어 브라우저에서 AIR 안으로 D&D를 할 수 있고

AIR 에서 탐색기창으로 D&D 할 수도 있다.

자 그럼 살펴보기 전에 어떻게 D&D 하는지 그 기본을 알아둘 필요가 있다.
 
 - Drag & Drop

Drag 에는 두가지 종류가 있다.

[복사]와 [이동].

복사는 말그대로 원본을 유지하고 새롭게 하나를 만드는 것이고

이동은 원본이 삭제되는 액션이다.

복사는 원본이 살아있기 때문에 문제될게 없지만

이동을 할때는 많은 주의를 해야한다.

아직 작업이 끝나지 않은 상태에서 지워버리게 되면 큰일나기 때문이다.

 - Drag 요소

드래그에는 2가지 요소가 필요하다.

 - 드래그 하는 동안 마우스를 따라다닐 썸네일 화면.
 - 전송될 데이타.

썸네일 화면은 드래그 하는 동안 보여지게 될 미리보기라고 생각하면 되고 그 타입은 BitmapData 다.

전송될 데이타는 Array 며 각 원소마다 데이터를 넣어놓으면 된다.

위와 같이 D&D 는 액션을 취하기전에 고려해야될 로직이 많다.

그리고 D&D 는 AIR 안에서 밖으로 보낼때와

AIR 밖에서 안으로 들여올때의 액션이 차이가 많다.

바깥에서 안으로 드래그될때의 액션을 살펴보자.

소스 보기


1. NativeDragEvent.NATIVE_DRAG_ENTER 이벤트 리스너를 등록한다.
2. NativeDragEvent.NATIVE_DRAG_ENTER 이벤트가 발생했을때 어디에 드랍을 허용할 것인지 결정한다. DragManager.acceptDragDrop(this);

이것이 간단한 D&D 의 샘플이다.

AIR 파일을 만들고 바탕에 아무런 무비클립만 만들고 프레임 창에 붙여넣기하면 샘플을 볼 수 있다. (Ctrl + Shift + Enter 잊지 말자.)

Tag : 3.0, AIR, 아폴로, 에어

[AIR강좌] Flash CS3 로 AIR 프로젝트 만들기

Posted 2007/08/27 17:27 by wooyaggo
첫 실행 화면에서

Create New > Flash File (Adobe AIR) 를 선택해서 파일을 생성한다.

p.s) 처음에 뜨는 알럿창은 항상 뜨니까 체크박스 했는데도 뜬다고 뭐라고 하지 말자^^
가장 처음에 해볼 것이 아마 크롬창과 trace 일텐데

크롬창은 Commands > AIR - Application & Installer Settings > Window style 에 보면

3가지 옵션이 있다.

System Chrome : 상단 타이틀과 하단바가 있는 기본 모양이다.

Custom Chrome (opaque) : 배경색이 살아 있는 모양이다.

Custom Chrome (transparent) : 배경색이 투명은 모양이다. 가장 선호하지 않을까 싶다^^

그리고

trace 를 찍어도 output 창에 나오지 않는다.

Ctrl + Shift + Enter 로 디버그 모드로 테스트해야 trace 가 보인다.

이점 꼭 유의하자!!

그외의 방법은 3.0 개발 방법과 동일하다.

Tag : 3.0, AIR, 설치, 아폴로, 에어

[AIR강좌] AIR 설치하기

Posted 2007/08/27 17:27 by wooyaggo
Flash CS3 는 설치되어 있다고 가정하고

Adobe Labs 에서 AIR Update 버젼을 받아서 설치한다.

[다운받기]

Tag : 3.0, AIR, 아폴로, 에어

독도 광고 모금 캠페인