화면을 꽉채워주는 풀스크린은 대부분의 어플리케이션에서 제공하고 있다 물론 AIR에서도 디스플레이 상태를 설정함으로서 이를 구현 할 수 있다.

[ 스테이지 디스플레이 상태 설정 ]
FULL_SCREEN : String = "fullScreen" 
풀스크린모드로 설정

FULL_SCREEN_INTERACTIVE : String = "fullScreenInteractive"
사용자의 반응을 체크/응답할 수 있는 영역의 풀스크린 모드로 설정
NORMAL : String = "normal"
일반적인 기본 상태

이처럼 stage의 정열이나 디스플레이 상태등을 설정하여 우리가 원하는 크기와 영역등을 설정 할 수 있다.

이제 어플리케이션 설정을 마치는군요...가장 많은 내용이 있었던 챕터 같습니다.
Posted by 버터백통

반드시 사용자의 확인이 필요하거나 주의를 집중시키기 위하여 작업창이 깜박이는 아이콘을 본적이 있을 것이다. 주로 나같은 경우에는 익스플로러를 실행하고 다른 창을 보고있으면 실행 완료 되면 작업 표시줄에 깜빡이는 브라우저 아이콘을 보게된다. 역시 AIR에서도 이러한 기능을 제공하고 있다.

바로 NativeWindow에 notifyUser()에 파라미터 NotificationType을 설정하여 유저에게 알림을 준다
NotificationType.CRITICAL : 작업표시줄의 아이콘과 크롬창이 깜빡인다.
NotificationType.INFORMATIONAL : 작업표시줄의 아이콘만 불이 들어온다
Posted by 버터백통
 
AIR를 공부하면서 가장 마음에 드는 기능 중에 하나는 타파일과의 연계이다. 가령 *.jpg나 *.gif를 클릭하면 이미지뷰어가 자동으로 실행한다. 또는 *.ppt문서를 클릭하면 자동으로 파워포인트가 실행하듯이 기존의 포맷이나 자신만의 특정한 파일포맷을 만들어 *.jys나 *.butter이라는 확장자를 만들어 자신만의 어플리케이션을 만들수 있는 것이다. 이를 실행하기 위해서는 몇가지 설정만으로 가능해진다.

[ 연계관련 메서드 ]
NativeApplication.nativeApplication.setAsDefaultApplication("확장자")
현재 어플을 특정 파일의 기본 어플로 설정
   
NativeApplication.nativeApplication.removeAsDefaultApplication("확장자");
연계된 특정 파일과 연계를 제거

NativeApplication.nativeApplication.isSetAsDefaultApplication("확장자")
현재 어플과 특정 파일과 연계 여부를 체크

NativeApplication.nativeApplication.getDefaultApplication("확장자")
특정 파일에 연계된 디폴트 어플리케이션 이름을 반환

 
메서드와 함께 실행할 파일을 디스크립터의 <fileTypes>를 설정하여야 한다.
또한 로컬에 설치된 상태이어야 연게가 가능하며 이미 타 어플리케이션과 연계되어있다면 사용자의 확인(클릭)후에 자신의 APP와 연계가 가능해진다.
Posted by 버터백통

메신저나 위젯처럼 시스템 실행시 자동으로 실행하여 사용자의 사용을 유도하거나 편의성을 제공하도록 하기 위해서는 AIR에 NativeApplicationstartAtLogin속성을 true로 설정한다.
단 설치된 상태에서만 동작한다. 그렇지 않으면 컴파일 에러를 발생
Posted by 버터백통

AIR는 CS이다 보니 사용자의 자리비움을 체크해야 하는 경우가 있다. 따라서 자리비움이면 중요 정보창인 경우 자동으로 창이 닫히게 하거나 풀스크린 창을 띄워 화면보호기 역할을 수행 할 수도 있게된다.
이는 바로 NativeApplication의 nativeApplication에 idleThreshold에 값을 설정하여 유휴시간을 정할 수 있다. 기본은 300초이고 설정은 초단위로 값을 설정할 수 있다.

설정후에 실제 자리비움이 발생하면 이를 체크하는 이벤트를 등록한다. 
USER_IDLE  : 자리비움 발생 이벤트
USER_PRESENT : 자리비움 해제이벤트


Posted by 버터백통

NativeWindow는 생성시 width와 height를 이용하여 창의 크기를 정하여 준다. 또한 생성 이후 runtime시 크롬창으로 창의 크기를  새로 조절할 수 있다. 그러나 크롬레스창으로 조절기능이 없거나 기타 예외사항이 발생하여 조절할 수 없는 창을 runtime시 새로 조절하기 위해서는 startResize(기준이 되는 코너설정)를 사용한다. 물론 stage에는 이를 제어할 버튼이나 처리 할 수 있는 객체가 있어야 할 것 이다.
중요한 것은 startResize 이후 화면갱신이 중요하다. startResize시에는 희미한 회색 테두리만 화면에 그려지므로 실제 이것이 창의 크기에 반영되지 않는다.
따라서 startResize()이 완료될 때 NativeWindowBoundsEvent.RESIZE 이벤트를 사용하여 완료시 stageWidthstageHeight속성을 활용하여 화면을 새로 그리거나 위치 등을 재정리 하여야 한다.

마찬가지로 크롬창이나 창을 조절할 수 없는 형태의 창에서는 startMove()를 사용하여 NativeWindow를 드래그 할 수 있다.
Posted by 버터백통
여러개가 활성화된 NativeWindow에서 창의 앞과 뒤를 바꾸어 주어야 하는 경우가 종종 발생하게 된다. 물론 사용자가 클릭하면 자동으로 제일 앞으로 이동하게 되는데 그렇지 않고 설치나 작업 중에 자동으로 앞뒤의 위치를 바꾸어 가며 정보나 작업상태를 표현하거나 confirm을 요구하는 경우일 때는 코드에서 이러한 처리응 해주어야 한다.

이러한 경우 NativeWindow에서 제공하는 몇 가지 속성이 있다.
orderToFront(); : 한단계 앞으로
orderToBack(); : 한단계 뒤로
orderInFrontOf(매개변수); : 매개변수의 윈도우 보다 앞에 위치
orderInBackOf(매개변수); : 매개변수의 윈도우 보다 뒤에 위치
alwaysInFront : 항상 다른 윈도우창보다 앞으로 위치

위와 같은 메서드를 사용하여 현재 창과 다른 창의 위치를 변경할 수 있다. 이들은 앞서 살펴본 openedWindows에서 제공하는 배열과 함께 사용하며 매개변수는 배열의 원소 값를 이용한다.
Posted by 버터백통

작업을 하다가 모든창을 닫거나 뒤에 가려진 창을 앞으로 이동시키거나 하는 작업을 하기위해서는 현재 열려있는 창으로 접근하여야 한다. 창이 많은 때는 하나하나 delegator를 기록하고 있다가 제어하기 힘들다. 따라서 이들을 관리하는 옵저버가 있을 것이라 생각을 하게 된다. 바로 openedWindows가 이들을 관리하는 옵저버이다.

현재 열려있는 모든 창은 자동으로 NativeApplicationnativeApplicationopenedWindows에 배열로 저장되어있다. 따라서 배열 변수를 선언하고 NativeApplication.nativeApplication.openedWindows를 받아서 현재 열려 있는 모든창으로 접근이 가능해 진다.

 
[ NativeWindow의 순서 ]

먼저 생성된 것이 정수 색인 배열에서 가장 먼저 자리잡고 나중에 생선된 것이 그 앞을 가리게 된다.
따라서 배열에는 적은 정수가 먼저 생성된 것들이고 뒤에서 가려지고 있는 것이다.
가령 창이 3개가 있으면 3번째 창은 배열에서 2에 해당하는 위치에 자리잡고 있다.



Posted by 버터백통


NativeWindow는 delegator에서 visible속성이나 activate()를 하면 창이 활성화 된다. 창을 닫기 위해서는 close() 메서드를 사용하는데 한번 close된 창은 두번 다시 재 활용할 수 없게 된다. 따라서 창을 다시 열 수 있도록 하기 위해서는 visible을 컨트롤 해야 한다. 또한 사용자가 크롬 창의 닫기버튼을 사용하여 close할 경우를 대비하여 해당 윈도우를 닫을때 NativeWindow의 delegator에 CLOSING이벤트를 두어 visible속성을 false로 한다.
이경우 preventDefault()를 사용한다.

private var options:NativeWindowInitOptions;
private var window:NativeWindow;
private function init():void
{
    options = new NativeWindowInitOptions();
    options.type = NativeWindowType.NORMAL;
    window = new NativeWindow( options );
    
    addEventListener( MouseEvent.CLICK , onOpen );
    window.addEventListener( Event.CLOSING , onClose );
    
    window.width = window.height = 200;
    window.activate();
}
   
private function onOpen( e:MouseEvent ):void
{
      window.visible = true;
}
   
private function onClose( e:Event ):void
{
    window.visible = false;
    e.preventDefault();
}

위의 코드는 자식창을 크롬에서 닫기하였을 때 visible로 컨트롤하고 메인창을 클릭하면 visible = true로 하여 창을 다시 활성화 하도록 처리하였다.

참고) visible을 컨트롤 하여도 작업표시줄에 비활성화 된다.

Posted by 버터백통

윈도우의 상태 즉 모니터상에서 위치나 크기 등 메인 어플리케이션은 WindowedApplication속성이나 디스크립터 또는 <mx:Script>에서 nativeWindow로 접근하여 사용한다.
보통 크기는 width , height 위치는 x , y 등으로 설정되므로 .xml에서 찾아보면 쉽게 발견 할 수 있다.

메인에서 생성된 서브윈도우(NativeWindow)의 위치나 크기 설정도 앞서 투명창 설정한 바와 같이 Delgator에 바로 속성을 설정할 수 있다.
window.width = 300
window.height = 200
window.x = 300
window.y = 400


참고로 이벤트에 의하여 객체를 받아(event.target) Delegator를 처리할때는
아래처럼 stage로 접근하여 붙어있는 nativewindow로 접근한다.
event.target.stage.nativeWindow.x = 0;
event.target.stage.nativeWindow.y = 0;

사용자 모니터의 해상도를 읽어와 항상 가운데에 위치하도록 하기 위해서는 flash.system.Capabilities를 사용한다.

모니터 중앙에 위치
window.x = ( Capabilities.screenResolutionX - width ) / 2;
window.y = ( Capabilities.screenResolutionY - height ) / 2;  

참고로 screenResolutionX는 사용자 모니터의 가로 해상도이며 screenResolutionY는 세로 해상도이다.
Posted by 버터백통
1 메인 어플리케이션 윈도우에 크롬레스적용하기
투명윈도우 창을 만들기위해서는 디스크립터를 이용하여야한다. 물론 플래시는 이부분의 편집을 상당히 쉽게 설정할 수 있도록 되어있지만 플렉스는 .xml에서 <initialWindow>에 크롬레스 등 필요한 설정을 하여야 한다.

플렉스에서는 투명창을 만들기 위해서는 반드시 mx.Window라는 어플리케이션을 포함하고 있어야 한다. 가장 바깥을 감싸고 있는 WindowedApplicationshowFlexChrome="false"로 설정하고  그 안에 Window( UI컴퍼넌트를 포함한 레이아웃컨테이너를 상속받은 클래스 )에 속성을 systemChrome="none" transparent="true" type="lightweight" showFlexChrome="false" 로 설정하여야 정상적인 투명창을 만들 수 있다. 불편한 설정도 플렉스4에서는 많이 개선되리라 기대해본다...

참고로 플렉스의 컴퍼넌트를 사용하면 플래시보다 파일크기가 상당히 커지게 된다. 코딩이 편한 장점이 크지만 결과물에 대한 단점이 매우 치명적이다. 따라서 액션스크립트 프로젝트에서도 AIR가 지원되야 한다고 생각한다.

2 서브 윈도우에 크롬레스 적용하기
메인 윈도우에서 생성된 서브윈도우( 이벤트 디스패쳐를 상속받은 NativeWindow클래스 )는 스테이지가 등록되어있고 Window컴퍼넌트에서 지원하는 메서드와 속성을 제공하고 있다.

//옵션설정
var option:NativeWindowInitOptions = new NativeWindowInitOptions();
option.type = NativeWindowType.LIGHTWEIGHT;
option.systemChrome = NativeWindowSystemChrome.NONE;
option.transparent = true;
    
//새창생성    
var window:NativeWindow = new NativeWindow(option);
window.visible = true;

//배경생성
var bg:Sprite = new Sprite();
bg.graphics.beginFill(0xFFFFFF , 0.5 );
bg.graphics.drawRoundRectComplex(0,0,200,200,10,10,10,10)
bg.graphics.endFill();
    
//환경설정
window.stage.addChild( bg );
window.width = 200
window.height = 200
window.stage.align = StageAlign.TOP_LEFT;
window.stage.scaleMode = StageScaleMode.NO_SCALE;
Posted by 버터백통

AIR는 메인 클래스 또는 도큐먼트 크래스를 어플리케이션으로 설정한다. 따라서 기본 창은 1개를 제공하는데 경우에 따라 서브 윈도우를 열어야 하는 경우 nativeWindow클래스를 사용한다.따라서 어플리케이션(윈도우)과 그와 연계된 서브 프로세스(윈도우)들로 구성된다.

어플리케이션에서 윈도우를 새로 만들기 위해서는 NativeWindow()클래스를 사용한다. 이때 반드시 NativeWindowInitOptions()를 설정하여 NativeWindow()의 파라미터로 설정한다. NativeWindowInitOptions()는 새로 열릴 윈도우의 상태를 설정하는 클래스이다.

type = 새로만들 윈도의 시스템 크롬 설정
NativeWindowType.UTILITY : 시스템 크롬을 부분적 사용
NativeWindowType.NORMAL : 시스템 크롬을 전부 사용(새로운 인스턴스 생성에 적합)
NativeWindowType.LIGHTWEIGHT : 시스템크롬을 비사용(systemChrome = none 설정)
systemChrome = 윈도우창(주변의 크롬 창)의 옵션바 등의 투명도 설정
NativeWindowSystemChrome.STANDARD : OS의 기본 크롬창을 사용한다.
NativeWindowSystemChrome.NONE : 크롬창을 제거한다.
transparent : 투명 여부 설정
minimizable : 최소화 여부 설정
maximizable : 최대화 여부 설정
resizable : 리사이즈 여부 설정
x : 윈도우 창의 x위치
y : 윈도우 창의 y위치
width : 윈도우창의폭
height : 윈도우 창의 높이

NativeWindow()는 디스플레이 오브젝트 컨테이너를 상속받지 않는다. 따라서 이를 담고있는 stage로 가서 객체를 addChild()하여야 한다. 또한 컨텐츠의 정열과 크기의 제어 또한 stage에서 설정한다.
scaleMode : 윈도우 창에 의한 스케일 조절
StageScaleMode.NO_SCALE : 컨텐츠의 스케일 변화 없게
StageScaleMode.EXACT_FIT : 종횡비 없이 강제로 알맞는 크기 제어
StageScaleMode.NO_BORDER : 종횡비를 유지하되 깨짐을 최소화 하여 컨텐츠 크기 제어
StageScaleMode.SHOW_ALL : 종횡비를 유지하고 깨짐을 최소화 하여 전체 내용이 보이도록 크기 제어
align : 윈도우 창에 의한 위치 설정
StageAlign에 여러가지 설정된 상수로 설정한다.

이렇게 생선한 윈도우는 항상 visible = true나 activate(활성화)에 의해 화면에 나타나게 된다.


Posted by 버터백통