Adobe AIR 2.0 이 발표되었습니다.

내년 초에 정식으로 나온다는데 기대가 이만 저만이 아닙니다.

AIR 2.0 의 새로운 기능에 대해서 전해드리겠습니다.


  - Multitouch and Gesture

AIR 2.0과 Flash Player 10.1에서 멀티터치에 대한 API가 제공됩니다.

GestureEvent와 TransformGestureEvent를 통해서 전달되며

GestureEvent의 종류는

 - GestureEvent.GESTURE_TWO_FINGER_TAP
 - GestureEvent.GESTURE_PRESS_AND_TAP

iPod touch를 써보신 분들은 아시겠지만 탭의 종류는 두 가지입니다. 두 손가락으로 두드리는 것과 한 손가락으로 두드리는 것입니다.

한 손가락으로 두드렸을때는 GESTURE_PRESS_AND_TAP 이벤트가 발생하고

두 손가락으로 두드렸을때는 GESTURE_TWO_FINGER_TAP 이벤트가 발생하는 것입니다.

그리고 TransformGestureEvent는 다음과 같습니다.

 - TransformGestureEvent.GESTURE_PAN
 - TransformGestureEvent.GESTURE_ROTATE
 - TransformGestureEvent.GESTURE_ZOOM

두 손가락으로 같은 방향은 pan, 간격을 유지하며 서로 다른 방향일 때는 rotate, 두 손가락이 서로 가까워지거나 멀어지면 zoom으로 구분됩니다.

iPod touch를 사용할 때 할 수 있는 동작들을 모두 지원합니다.

아래는 시연 영상입니다.

(Play하면 자동으로 멀티터치부분부터 재생됩니다.)






  - Opening Files

“Launch file apps” 라고 소개되었던 내용입니다.

정확한 표현은 “Opening File”입니다. 즉 파일을 실행시키는 것과 마찬가지입니다.

간단하게 예를 보여드리면

var file: File = new File( “/design.psd” );
file.openWithDefaultApplication();

즉 해당 파일의 확장자로 지정되어있는 프로그램으로 연결시켜주는 것입니다.

psd라면 포토샵으로 exe파일이라면 실행을 시켜주겠지요.

먼가 감이 오시나요?

그렇습니다.

이날 Mike Chambers가 만든 예제를 보여줬었습니다.

바로 script 파일을 만들어 Mac에서 실행시켜서

바탕화면의 스크린샷을 찍는 것을 보여줬습니다.

비록 Application으로 바로 가져올 수는 없지만 (방법이 없진 않죠 :P )

외부 API를 call할 수 있다는 것만으로도 할 수 있는 것이 많게 될거 같습니다.

AIR가 바탕화면을 찍을 수 없다는 것이 참으로 한이었기 때문이죠.

어쨌건 이제 탐색기나 FTP프로그램을 완벽하게 만들 수 있게 되었습니다.



  - File “downloaded”

Mac유저라면 파일들이 Download 된 것인지 알고 싶어할때가 있었던가 봅니다.

file.donwloaded 라는 속성(get/set)이 추가되었습니다.

만약 FileReference.download()를 통해서 다운받으면 자동으로 속성이 true로 설정됩니다.



  - Volume Detection

USB로 시연하던 내용이 바로 이 내용입니다.

새로운 Storage가 연결되거나 해제될때 event를 받을 수 있게 되었습니다.

StorageVolumeInfo.storageVolumeInfo.addEventListener( “...”, volumeListener );

function volumeListener( e: SomeEvent ): void
{
    var volume: StorageVolume = e.storageVolume;
    trace( volume.fileType ); // FAT, NTFS
    trace( volume.isRemovable ); // true, false
    trace( volume.isWritable ); // true, false
    trace( volume.drive ); // maybe a File
    trace( volume.name ); // String
    trace( volume.rootDirectory ); // maybe a File
}

아직 이벤트에 대한 정보는 없어서 간단하게 코드로 예를 들어 보았습니다.

또 이제는 모든 드라이브 정보를 받아올 수 있습니다.

var drives: Vector< StorageVolume > = StorageVolumeInfo.storageVolumeInfo.getStorageVolumes;

var volume: StorageVolume;
for each( volume in drives )
{
trace( volume.nativePath );
}

// c:\
// d:\
// e:\

이와 같이 사용할 수 있게 될것입니다.

아래는 디바이스별 detect할 수 있는 목록입니다.

 Device Receive Event
isRemovable
 Audio CD
 True  True
 Data CD
 True  True
 USB Flash Drive
 True  True
 Firewire Drive
 True  False
 USB Hard Drive
 True  False
 Share Volume (Time Capsule)
 True  True
 Network Drive
 True  False
 Digital Camera (Picture Transfer Protocol)
 False  False
 iPhone  False  False
 Flip Video
 True  True




  - Native Processes

AIR에서 이제 외부 실행파일을 실행시킬 수 있게 되었습니다.

파라미터를 넘겨서 전달할 수 도 있습니다.

다만 외부 실행파일에서 값을 전달 받을 수는 없습니다.

보안이 이유겠지요.

다음과 같은 코드를 보실까요.

var exeFile: File = new File ( "merong.exe" );

var process: NativeProcess = new NativeProcess();

var args: Vector.< String > = new Vector.< String >();
args[ 0 ] = "-a";
args[ 1 ] = "merong";

var startUp: NativeProcessStartUpInfo = NativeProcessStartUpInfo();
startUp.arguments = args;
startUp.executable =  exeFile;

process.start( startUp );

이해가 바로 가시죠?

NativeProcess라는 객체를 생성해서 StartUpInfo 에 실행시킬 파일과 전달할 파라미터를 넣어주고 start() 시켜주면 됩니다.

이렇게 실행하면 프로세스가 시작되는 Event와 끝나는 Event를 알 수 있습니다.

끝나는 때에 맞춰 폴더를 열어준다던가 정보를 보여준다던가 할 수 있을거 같습니다.

이 밖에 실행하는데 있어서 몇가지 조건이 있는데 아직 분석이 정확하지 않아 자세히 알아본후에 업데이트하겠습니다.



 - File Promises

파일에는 실제로 존재하지 않는 파일이 있을 수 있습니다.

예를 들면 FTP에서 파일을 드래그해서 가져온다던가 파일만 먼저 만들어놓고 내용은 나중에 기록하는 것들이 있겠죠.

이런 파일들을 컨트롤할 수 있게 되었습니다.

IFilePromise 인터페이스가 추가됐습니다.

open(): IDataInput
close();
reportError();
isAsync
relativePath

등의 메소드, 속성들이 있습니다.

그리고 URLFilePromise 와 ClipboardFormats.FILE_PROMISE_LIST_FORMAT 이 추가되었습니다.

Adobe는 이 기능을 사용할 경우 progress bar를 꼭 넣어주라고 권장하고 있습니다.




 - ServerSocket

드디어 ServerClient 뿐만이던 Flash에게 ServerSocket이 생겼습니다.

P2P Application을 만들 수 있게 됐고

FTP도 지원하게 됐습니다.

var socket: ServerSocket = new ServerSocket();
socket.bind( 23, "localhost" );
socket.listen();
socket.addEventListener( Event.CONNECT, connectClient );

function connectClient( ...args ): void
{
// do something to client.
}

와 같은 코드이지 않을까 싶습니다.

(메소드는 공개됐지만 api전체가 공개된게 아니라 정확하지 않습니다.)

+ Recent posts