Flex ActionScript 関連覚書などなど

まずはサンプル。

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を使う。

コメント

コメントする