2009-05-02 9 views
0

Ich habe einen Drag & Drop-Handler in meiner Flex-Anwendung. Der Drag-Proxy oder das "Geisterbild", das beim Ziehen angezeigt wird, muss vor dem Ziehen geladen werden, was einige Zeit in Anspruch nimmt. Wie kann ich es sofort laden oder laden? Eine Lösung besteht darin, das Bild zu duplizieren, aber soweit ich weiß, können Bildobjekte nicht dupliziert werden, ohne eine weitere Variable zu erstellen, die noch etwas Zeit zum Laden benötigt.Flex: Dupliziere Instanz eines Bildes

Vielleicht dieser Code wird es besser illustrieren:

public function DragApp (e : MouseEvent) : void { 
    var dragInitiator : Image = e.currentTarget as Image; 
    var dragSource : DragSource = new DragSource(); 

    var dragProxy : Image = new Image(); 
    dragProxy.source = e.currentTarget.source; // Won't work unless image is embedded 
    dragProxy.load (e.currentTarget.source); // Must load 

    setTimeout (DragManager.doDrag, 350, dragInitiator, dragSource, e, dragProxy); 
} 

Antwort

3

Ich glaube, das Problem ist, dass Sie nicht sind, eine Breite und Höhe für die Bildeinstellung (irgendwie überflüssig für eingebettete Bilder):

dragImage: IFlexDisplayObject (default = null) - Das zu ziehende Bild. Dieses Argument ist optional. Wenn sie weggelassen wird, wird während des Drag & Drop-Vorgangs ein Standard-Ziehen-Rechteck verwendet. Wenn Sie ein Bild angeben, müssen Sie explizit eine Höhe und Breite des Bildes angeben, sonst erscheint es nicht .

Wenn Sie eine Breite und eine Höhe für das Bild-Proxy in Ihrem Beispiel zu definieren, wird es wahrscheinlich funktionieren:

var dragProxy : Image = new Image(); 
dragProxy.source = dragInitiator.source; 
dragProxy.width = dragInitiator.width; 
dragProxy.height = dragInitiator.height; 
+0

Vielen Dank! Dies löst mein Problem! Aber warum erscheint das Bild, wenn ich den DoDrag in ein Timeout setze? Ich dachte, es müsste eine weitere Instanz des Bildes erstellen und es zuerst laden. Passt das Bild seine Breite und Höhe an einem bestimmten Punkt automatisch an? – Aethex

2

Du bist besser dran eine Bitmap-Erfassung des Bildes mit und die Verwendung dieser als Dein DragProxy. Hier ist ein einfacher Code, um die BitmpData von jedem UIComponent zu erfassen:

private function getUIComponentBitmapData(target : UIComponent) : BitmapData 
{ 
    var bd : BitmapData = new BitmapData(target.width, target.height); 
    var m : Matrix = new Matrix(); 
    bd.draw(target, m); 
    return bd; 
} 

Sobald Sie, dass Sie eine neue Bitmap der BitmapData- erstellen können mit und die Bitmap als Quelle einer Image-Komponente liefern. Weitere Details/Beispiele in diesem Blog-Eintrag:

http://www.cynergysystems.com/blogs/page/andrewtrice?entry=flex_2_bitmapdata_tricks_and