Aufgabenstellung
UI-Komponenten sollen per Drag and Drop verschoben werden können.
Ansatz
Dieser Artikel beschreibt die notwendigen Flex-APIs (DragManager) für die Implementierung einer Drag and Drop-Funktionalität am Beispiel der (siehe Nachfolgeartikel) eLearning-Anwendung für das V-Modell.
Lösung
1.) Definition der verschiebbaren Komponenten und der Behälter-Komponenten.
<!-- WIRD VERSCHOBEN --> <mx:Button dragComplete="dragCompleteHandler(event);" label="System-Entwurf" id="btnSystementwurf" /> <mx:Button dragComplete="dragCompleteHandler(event);" label="Software-Entwurf" id="btnSoftwareentwurf" /> .. <!-- WIRD HINEINGESCHOBEN --> <mx:HBox verticalAlign="middle" verticalScrollPolicy="off" horizontalScrollPolicy="off" id="dropField1" /> <mx:HBox verticalAlign="middle" verticalScrollPolicy="off" horizontalScrollPolicy="off" id="dropField2" />
2.) Registrierung der Eventlistener
<mx:Application creationComplete="{onCreationComplete()} ... public function onCreationComplete():void { // Registrierung des Buttons "Anforderungsanalyse" für das Verschieben in ein Feld this.btnAnforderungsnanalyse.addEventListener( MouseEvent.MOUSE_DOWN, beginDrag ); // Registrierung des Buttons "AbnahmeEntwurf" für das Verschieben in ein Feld this.btnAbnahmeEntwurf.addEventListener( MouseEvent.MOUSE_DOWN, beginDrag ); ... // Die DropListener werden an die UI-Komponten, bzw. die Komponeten, in die // die Objekte geschoben werden können, angehängt this.dropField1.addEventListener( DragEvent.DRAG_ENTER, acceptDrop ); this.dropField2.addEventListener( DragEvent.DRAG_ENTER, acceptDrop ); .. this.dropField1.addEventListener( DragEvent.DRAG_DROP, handleDrop ); this.dropField2.addEventListener( DragEvent.DRAG_DROP, handleDrop ); } [/actionscript3] 3.) Implementierung der Logik - Hier: Überprüfung ob alles richtig verschoben ist [actionscript3] private function dragCompleteHandler(event:DragEvent):void { var draggedButton:Button = event.dragInitiator as Button; var dragInitCanvas:HBox = event.dragInitiator.parent as HBox; var stimmt1:Boolean = getButtons(dropField1).indexOf('btnAnforderungsnanalyse')>-1; var stimmt2:Boolean = getButtons(dropField2).indexOf('btnSystemarchitektur')>-1; if(stimmt1&&stimmt2) { Alert.show('Congratulations you did it!'); } }
4.) Welche Buttons sind in den Container? (Hier HBOX)
private function getButtons(box:HBox):String
{
var btnString:String=“;
var numChildren:Number = box.numChildren;
for (var i:int = 0; i < numChildren; i++) { if(box.getChildAt(i)["id"]) { btnString=box.getChildAt(i)["id"]; } } return btnString; } [/actionscript3] 5.) Management der Drag and Drop Funktionalität [actionscript3] public function beginDrag( mouseEvent:MouseEvent ):void { // the drag initiator is the object being dragged (target of the mouse event) var dragInitiator:IUIComponent = mouseEvent.currentTarget as IUIComponent; // the drag source contains data about what's being dragged var dragSource:DragSource = new DragSource(); // add some information to the drag source dragSource.addData( "name", dragInitiator.name ); dragSource.addData( "parent", dragInitiator.parent.name ); // ask the DragManger to begin the drag DragManager.doDrag( dragInitiator, dragSource, mouseEvent, null ); } public function handleDrop( dragEvent:DragEvent ):void { var dragInitiator:Button = Button( dragEvent.dragInitiator ); var dropTarget:HBox = dragEvent.currentTarget as HBox; HBox(dropTarget).addChild(dragInitiator); } public function acceptDrop( dragEvent:DragEvent ):void { var dropTarget:IUIComponent = dragEvent.currentTarget as IUIComponent; var dragSource:DragSource = dragEvent.dragSource; // accept the drop DragManager.acceptDragDrop( dropTarget ); // show feedback DragManager.showFeedback( DragManager.MOVE ); } [/actionscript3]