Paradigm Shift Design

ISHITOYA Kentaro's blog.

ドラッグアンドドロップの実装

Flexドラッグアンドドロップの実装は,本当に簡単.


まず,ドラッグされる側の実装.
ここでは,ラベル.

public function onDragStart(event:MouseEvent):void{
    var src:DragSource = new DragSource();
    var label:Label = event.currentTarget as Label;
    src.addData(label.text, "text");
    DragManager.doDrag(label, src, event, label); 
}

というようなイベントハンドラを作り,

label.addEventListener(MouseEvent.MOUSE_DOWN, this.onDragStart);

として登録すればいい.DragSourceにはどんなオブジェクトでも設定できる.
Drag時の見た目は,DragManager.doDragの第4引数に渡すコンポーネントで設定できる.上の例では面倒くさかったのでlabelをそのまま渡しているが,ちゃんとCanvasに描画してもいい.


次にドロップされる側の設定.

public function onDragEnter(event:DragEvent):void{
    if(event.dragSource.hasFormat("text")){
        DragManager.acceptDragDrop(IUIComponent(event.target));
    }
}

のようにしてonDragEnterハンドラをつくる.
DragManagerのdoDragが呼ばれると,キャンセルされるまでドラッグ状態になって,その状態でカーソルの下にあるコンポーネントにonDragEnterイベントハンドラが登録されているかを確かめて,あれば呼んでacceptDragDropが呼ばれるかをチェックしているようである.


また,

public function onDragDrop(event:DragEvent):void{
    if(event.dragSource.hasFormat("text") == false){
        return;
    }
    var s:String = 
        event.dragSource.dataForFormat("text") as String;
                
    trace("dropped", s);
}

の様にonDragDropハンドラをつくる.
onDragEnterでacceptDragDropなコンポーネントにDropされるとコールされるイベントで,eventのdataSourceからdataForFormatを用いてDragされる側で定義したDataSourceを取り出せる.


あとは,

this.addEventListener(DragEvent.DRAG_ENTER, this.onDragEnter);
this.addEventListener(DragEvent.DRAG_DROP, this.onDragDrop);

のように,Dropされる側にイベントハンドラを登録すれば,ドラッグアンドドロップを実現することができる.


うーん.
このアーキテクチャーはかっこいいな.
script.aclo.usには敵わないけど.