まずはサンプル。
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を使う。