'AIR/클립보드연동과 드래그효과'에 해당되는 글 5건

  1. 2008.12.27 DragManager 활용
  2. 2008.12.27 Drag and Drop
  3. 2008.12.26 Clipboard의 지연 렌더링
  4. 2008.12.26 Clipboard의 전송모드
  5. 2008.12.24 Clipboard 활용 2

드래그 매니저를 활용하면 드래그와 드랍 또는 드랍허용 등을 관리 할 수 있다. 보통 AIR 어플리케이션 내부에서 클릭 드래그 할 때에 해당 객체나 작업 데이터를 클립보드에 저장하여 드랍시 활용하도록 하기 위해서는 NativeDragManager.doDrag( InteractiveObject, Clipboard , 비트맵데이터... )을 사용한다.
또한 시스템이나 AIR내부의 객체를 AIR내부의 드랍 가능영역을 지정하여 드랍 허용을 하기 위해서는 NativeDragManager.acceptDragDrop( 드랍대상:InteractiveObject )을 사용한다.

보통 드래그 작업을 시작하려면 아래의 순서와 같다.
[ 드래그 작업 순서 ]
1 새 Clipboard 객체를 만듭니다.
2 하나 이상의 형식으로 전송될 데이터를 클립보드에 추가합니다.
3 드래그 동안 프록시 이미지로 사용될 BitmapData 객체를 doDrag에 만들어 선언할 수도 있습니다.
4 이 작업에서 허용되는 액션을 제한하는 NativeDragOptions 객체를 만들 수도 있습니다. allowedActions 매개 변수를 null로 남겨 두면 모든 액션이 허용됩니다.
5 NativeDragManager.doDrag()를 호출합니다.


[ 드래그 시작 객체 프로세스 ]
1 doDrag() 메서드를 호출한 후에 nativeDragStart 이벤트발생
2 드래그가 진행 중인 동안에는 nativeDragStart 이벤트발생
3 사용자가 마우스를 놓아서 드랍 할 때에는 nativeDragComplete 이벤트를 전달

[ 드랍 시 프로세스 ]
nativeDragComplete 이벤트의 핸들러는 이벤트의 dropAction 속성을 확인하여 드래그 앤 드롭 작업이 완료되었는지를 결정할 수 있으며, dropActionNativeDragActions.NONE인 경우에는 드래그한 항목이 드롭 가능한 대상에 드롭되지 않은 것입니다.

doDrag() 은 mouseDown 또는 mouseMove 이벤트 핸들러 내에서만 호출할 수 있습니다.
mouseMove 이벤트에 대한 응답으로 호출된 경우에는 마우스 버튼도 눌러진 상태여야 합니다.

Posted by 버터백통


드래그 드랍은 기본적으로 복사해서 붙여넣기와 많은 부분이 동일하다. 드래그 앤 드랍은 다음의 작업들로 이루어 진다.
1 클릭(사용자의 작업이 시작)
2 전송할 데이터를 클립보드에 저장
3 드래그(붙여 넣을 위치 지정)
4 드랍(적절한 위치가 결정되면 클립보드에서 데이터를 읽어 온다)

[ 드래그 앤 드랍 프로세스 ]
initiator -> drop target -> 드랍 가능여부 판단 -> drop -> 가능여부에 따라 액션스크립트 코드 처리

드래그 드랍을 이용하려면 드래그 매니저를 활용하여 이미 잘 정의된 메서드를 이용하는 것이 능률적이다.
또한 드래그 드랍은 단순히 startDrag와는 달리 대상의 데이터를 읽어와 어떠한 처리를 하여야 한다. 물론 AS3 기반내의 클래스 처리도 가능하지만 AIR 클립보드를 사용하여 데이터를 저장하고 읽어오며, 여러개의 어플리케이션이나 네이티브 윈도우에서 상호 드래그앤드랍이 가능해진다.  

AIR 에서 드래그 드랍을 지원하는 클래스는  다음과 같다.
NativeDragManager : 드래그 시작와 허용 등 드래그 앤 드롭 작업을 조정

[ Public 속성 ]
dragInitiator : InteractiveObject

[정적] [읽기 전용] 드래그 작업을 시작한 NativeDragManager.doDrag() 호출에 전달된 대화형 객체입니다.
dropAction : String
[정적] 드롭 대상에 의해 지정된 드래그 액션입니다.
isDragging : Boolean
[정적] [읽기 전용] 드래그 작업이 현재 진행 중인지 여부를 보고합니다.


NativeDragEvent : 드래그 관련 이벤트

[ Public 속성 ]

allowedActions : NativeDragOptions

이 드래그 작업을 시작한 표시 객체에 의해 허용되는 액션을 지정하는 NativeDragOptions 객체입니다. 
clipboard : Clipboard
이 드래그 작업 내의 데이터가 포함되어 있는 Clipboard 객체입니다.
dropAction : String
현재 액션입니다.

[ Public 메서드 ]
NativeDragEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = true, localX:Number = NaN, localY:Number = NaN, relatedObject:InteractiveObject = null, clipboard:Clipboard = null, allowedActions:NativeDragOptions = null, dropAction:String = null, controlKey:Boolean = false, altKey:Boolean = false, shiftKey:Boolean = false, commandKey:Boolean = false)
기본 드래그 앤 드롭 이벤트와 관련된 특정 정보를 갖는 Event 객체를 만듭니다. 
clone():Event
NativeDragEvent 객체의 복사본을 만듭니다.
toString():String
이 NativeDragEvent 객체의 속성을 문자열 형식으로 만듭니다.

[ Public 상수 ]
NATIVE_DRAG_COMPLETE : String = "nativeDragComplete"

[정적] NativeDragEvent.NATIVE_DRAG_COMPLETE는 nativeDragComplete 이벤트 객체의 type 속성 값을 정의합니다. 
NATIVE_DRAG_DROP : String = "nativeDragDrop"
[정적] NativeDragEvent.NATIVE_DRAG_DROP은 nativeDragDrop 이벤트 객체의 type 속성 값을 정의합니다. 
NATIVE_DRAG_ENTER : String = "nativeDragEnter"
[정적] NativeDragEvent.NATIVE_DRAG_ENTER는 nativeDragEnter 이벤트 객체의 type 속성 값을 정의합니다.
NATIVE_DRAG_EXIT : String = "nativeDragExit"
[정적] NativeDragEvent.NATIVE_DRAG_EXIT는 nativeDragExit 이벤트 객체의 type 속성 값을 정의합니다.
NATIVE_DRAG_OVER : String = "nativeDragOver"
[정적] NativeDragEvent.NATIVE_DRAG_OVER는 nativeDragOver 이벤트 객체의 type 속성 값을 정의합니다. 
NATIVE_DRAG_START : String = "nativeDragStart"
[정적] NativeDragEvent.NATIVE_DRAG_START는 nativeDragStart 이벤트 객체의 type 속성 값을 정의합니다. 
NATIVE_DRAG_UPDATE : String = "nativeDragUpdate"
[정적] NativeDragEvent.NATIVE_DRAG_UPDATE는 nativeDragUpdate 이벤트 객체의 type 속성 값을 정의합니다.

NativeDragActions : 드래그 앤 드롭 액션의 이름에 대한 문자열 상수를 정의

[ Public 속성 ]
COPY : String = "copy"
[정적] 복사 액션에 사용할 문자열을 정의합니다. 
LINK : String = "link"
[정적] 링크 액션에 사용할 문자열을 정의합니다. 
MOVE : String = "move"
[정적] 이동 액션에 사용할 문자열을 정의합니다. 
NONE : String = "none"
[정적] 지정된 액션이 없을 경우 사용할 문자열을 정의합니다.

NativeDragOptions : 드래그 작업의 소스에 의해 허용되는 드래그 앤 드롭 액션을 지정

[ Public 속성 ]
allowCopy : Boolean = true
드롭 대상은 드래그된 데이터를 복사할 수 있습니다.
allowLink : Boolean = true
드롭 대상은 드래그된 데이터에 대한 링크를 만들 수 있습니다.
allowMove : Boolean = true
드롭 대상은 드래그된 데이터를 이동할 수 있습니다.

Posted by 버터백통

일반적으로 데이터 요청이 있을 때 바로 데이터를 클립보드에 사용하는데 복사 후 붙이는 과정에서 붙이기 전의 내용이 바뀌면 바뀌기 이전의 데이터를 사용하게 된다. 따라서 클립보드에서 데이터를 가져올 때 데이터의 레퍼런스만 정의하고 실제 붙이기할 때는 복사 이후 내용이 변경되었으면 변경된 데이터를 가져오게 처리를 하여야하는데 이것을 지연 렌더링이라고 한다. AIR에서는 setDataHandler( 클립보드포맷 , 대상데이터 )라는 메서드를 제공하는데 이를 사용하여 업데이트되는 데이터를 가져올 수 있도록 한다.

Posted by 버터백통
클립보드는 기본적으로 3가지 경우에서 사용이 된다.
1 동일 AIR 어플리케이션 안에서 데이터를 전송
2 2개 이상의 AIR 어플리케이션 사이에서 데이터를 전송하는 경우
3 AIR 어플리케이션과 시스템 또는 다른 응용프로그램 사이에서 데이터를 전송하는 경우


위와 같은 경우에서 2번 째와 3번 째의 경우에는 데이터의 복사본이 필요하다. 가령 어떠한 텍스트 내용을 AIR에서 워드나 한글 같은 경우 직접 데이터를 읽을 수 없기 때문에 데이터 복사본과 레퍼런스를 함께 저장하여야 한다.

setData()에서 3번째 파라미터인 직렬화(serializable)에 의해 자동으로 직렬화 저장(true)으로 설정된다. 값이 true이면 복사본과 레퍼런스가 저장되고 false이면 레퍼런스만 저장된다. 이 경우에는 데이터를 직렬화 하지 않고 복사하지도 않는 경우에서만 사용하여야 한다. 즉 단일 AIR 어플리케이션  내부에서만 사용하면 된다.

getData()에서는 원하는 방식으로 데이터를 받을 수 있다. 이 경우에는 두번 째 파라미터인 transferMode를 설정하여야 한다. 지원되는 전송 모드에는 4가지가 있으며 이들은 ClipboardTransferMode에 상수로 설정되어있다.

ClipboardTransferMode.CLONE_ONLY 
사용 가능한 경우 복사본이 반환된다. 복사본을 사용할 수 없을시에는 null이 반환

ClipboardTransferMode.CLONE_PREFERRED  
사용 가능한 경우 복사본이 반환된다. 복사본을 사용할 수 없을시에는 레퍼런스를 반환

ClipboardTransferMode.ORIGINAL_ONLY  
사용 가능한 경우 원본 데이터에 대한 레퍼런스를 반환, 원본 레퍼런스를 사용 할 수 없을시에는 null을 반환

ClipboardTransferMode.ORIGINAL_PREFERRED 
사용 가능한 경우 원본 데이터에 대한 레퍼런스를 반환, 원본 레퍼런스를 사용 할 수 없을시에는 복사본을 반환 (기본 설정 값)

참고) 전송 모드는 클립보드에 들어 있는 객체에 액세스할 때 참조를 반환할 것인지 아니면 복사본을 반환할 것인지에 대한 힌트를 제공한다

참고) 직렬화(serializable)란 객체의 내용을 바이트 단위로 자동 변환하여 저장/복원하거나 네트워크 등 전송 할 수 있도록 지원하는 기능이다. 단 멤버변수의 메모리만으로 구성되므로 메서드나 생성자는 직렬화에서 제외 된다.
이는 자바 1.1에서 도입 되었는데 원격통신이나 강태정보의 저장시 직렬화된 데이터를 사용하면 편하기 때문이고 AS3는 자바의 영향을 많이 받은 언어이므로 자바의 serializable를 그대로 지원한다.

Posted by 버터백통

대부분의 OS에는 임시저장 공간과 같은 Clipboard라는 것이 있다..이 클립보드를 활용하여 복사,잘라붙이기나 화면 캡쳐시 이미지가 임시 저장되는 공간으로 활용된다.
AIR에서는 위와 같은 시스템 클립보드와 AIR내부에서 지원하는 클립보드를 제공하고 있으며 이 둘을 모두 같은 클래스( flash.desktop.Clipboard )에서 취급한다.

[ 클립보드의 주된 기능 ]
1 데이터 추가 : Clipboard.setData(데이터 포맷 , 저장할 데이터)
2 데이터 읽기 : Clipboard.getData(데이터 포맷)
3 데이터 제거 : Clipboard.clearData(데이터 포맷) / Clipboard.clear()->모든 내용을 제거


[ 클립보드 데이터 포맷 ]
BITMAP_FORMAT : String = "air:bitmap"
[정적] 비트맵 이미지 데이터입니다(AIR만 해당).
 
FILE_LIST_FORMAT : String = "air:file list"
[정적] 파일의 배열입니다(AIR만 해당).

HTML_FORMAT : String = "air:html"
[정적] HTML 문자열 데이터입니다.

RICH_TEXT_FORMAT : String = "air:rtf"
[정적] 서식 있는 형식의 데이터입니다. ByteArray 반환

TEXT_FORMAT : String = "air:text"
[정적] 문자열 데이터입니다.

URL_FORMAT : String = "air:url"
[정적] URL 문자열입니다(AIR만 해당).

AIR의 클립도브를 사용할때는 new Clipboard(); 선언하여 사용한다.
시스템 클리보드가 아니므로 ctrl+v등을 사용하여 붙이기 등 시스템 전역적으로 사용하기 힘들다.
또한 Clipboard로 선언된 객체에만 저장이 되며 새로운 클립보드를 선언하여 데이터를 불러오면 null로 인식한다.

시스템 클립도브를 사용할때는 Clipboard.generalClipboard를 선언하여 사용한다.
시스템 클립보드이므로 전역적으로 사용가능하며 ctrl+c , ctrl+v등과 같이 사용이 가능하며  
Clipboard.generalClipboard는 시스템의 유일한 객체로 싱글턴 형태로 접근한다.

Posted by 버터백통