ドラッグアンドドロップの実装
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には敵わないけど.