まずはサンプル。
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 | package{ import flash.display.DisplayObject; import flash.display.Sprite; import flash.events.NativeDragEvent; import flash.desktop.DragManager; public class Main extends Sprite{ private var drop_target:Sprite = new Sprite(); public function Main(){ drop_target.addEventListener(NativeDragEvent.NATIVE_DRAG_ENTER, DaDEnterHandler); drop_target.addEventListener(NativeDragEvent.NATIVE_DRAG_DROP, DaDDropHandler); addChild(drop_target); changeColor(0x000000); } public function DaDEnterHandler(nde:NativeDragEvent):void{ DragManager.acceptDragDrop(nde.target as DisplayObject); changeColor(0x888888); } public function DaDDropHandler(nde:NativeDragEvent):void{ changeColor(0xFFFFFF); } private function changeColor(color:uint):void{ drop_target.graphics.beginFill(color); drop_target.graphics.drawRect(0, 0, 100, 100); drop_target.graphics.endFill(); } } } |
こんな感じ。
まずは、イベントハンドラ。
drop_target.addEventListener(NativeDragEvent.NATIVE_DRAG_ENTER, DaDEnterHandler); drop_target.addEventListener(NativeDragEvent.NATIVE_DRAG_DROP, DaDDropHandler);
これで、例えばデスクトップとかAIRアプリ外から、AIRアプリの中にドラッグされてきたものが、
DisplayObject上に乗ると、NATIVE_DRAG_ENTERイベントを受け取ることができるようになり、
ドロップされると、NATIVE_DRAG_DROPイベントを受け取ることができるようになる。
でもこのままだと、NATIVE_DRAG_DROPが発行されないっぽい。
ドロップ時にNATIVE_DRAG_DROPイベントを発行するには、
DragManager.acceptDragDrop(nde.target as DisplayObject);
これで指定してやる。
上のサンプルだったら、
DragManager.acceptDragDrop(drop_target);
でもOK。これで、ドロップのイベントもちゃんと発行される。
ちなみに、NativeDragEventはデフォルトではバブリングされない。
なので、acceptDragDropで指定したところ以外にはイベントは届かない。
それからDragManagerは同名のクラスがあって、
flash.desktop.DragManager
と
mx.managers.DragManager
だけど、AIRアプリの中からデスクトップへD&Dとか、
ブラウザからURLをAIRアプリにD&Dとかのときには、
flash.desktop.DragManagerを使う。