2008-12-02 75 views
2

(同時拖動)我有一個MX:帆布元件包含幾個MX:面板元件。我希望能夠畫出一條連接兩個這樣的mx:Panel的線,以便當其中一個或兩個被拖動時,該線繼續連接兩個mx:Panel。這似乎應該是微不足道的事情,但我一直無法弄清楚。連接線中的Flex /的Actionscript

實際上,這是問題所在。

alt text http://img150.imageshack.us/img150/5656/ishot1eu3.jpg

由於在小組到達它的最終位置,只要你開始拖動「B」面板中,你留下了一個懸掛線的更新只發生:

alt text http://img212.imageshack.us/img212/4296/ishot2qi6.jpg

如下所示,可能的解決方案是覆蓋mx:Canvas組件的updateDisplayList()方法。不幸的是,這隻在拖動之後更新圖形,而不是在運動時更新。 在面板中監聽「xChanged」和「yChanged」事件產生與覆蓋updateDisplayList()相同的結果。

最終溶液,如下面指出的那樣,需要調度從移動面板的移動事件來在其上移動的畫布。這迫使整個運動中的線條重新繪製。

感謝您的幫助!

回答

4

「我試圖重寫 MX的 updateDisplayList()方法:Canvas組件,但似乎 只更新 拖動後圖紙,我想爲行 跟隨mx:面板正在被拖動。「 」。

你可以聽在小組MoveEvent.MOVE事件,並有處理程序調用該行重新劃分,然後讓小組調度這些事件,而他們正在被監聽舞臺MouseEvent.MOUSE_MOVE事件和拖在處理程序分派MOVE事件(此處理程序附加到在該小組的MouseEvent.MOUSE_DOWN事件處理程序中的階段,處理程序沿着MouseEvent.MOUSE_UP(附連到級爲好) - 然後從階段在MOUSE_UP除去這兩個事件偵聽處理程序。)

下面是一個例子(這將是在面板s第ubclass :)

private function attachListeners():void 
{ 
    this.addEventListener(MouseEvent.MOUSE_DOWN, selfMouseDownHandler, false,0,true); 
    this.addEventListener(MoveEvent.MOVE, selfMoveHandler, false,0,true); 
} 

private function selfMoveHandler(event:MoveEvent):void 
{ 
    redrawConnectedLinks(); 
} 

private function selfMouseDownHandler(event:MouseEvent):void 
{ 
    stage.addEventListener(MouseEvent.MOUSE_UP, stageMouseUpHandler, false,0,true); 
    stage.addEventListener(MouseEvent.MOUSE_MOVE, stageMouseMoveHandler, false,0,true); 
} 

private function stageMouseUpHandler(event:MouseEvent):void 
{ 
    stage.removeEventListener(MouseEvent.MOUSE_UP, stageMouseUpHandler, false); 
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, stageMouseMoveHandler, false); 
} 

private function stageMouseMoveHandler(event:MouseEvent):void 
{ 
    dispatchEvent(new MoveEvent(MoveEvent.MOVE)); 
} 
+0

Humm ...這似乎與以前的解決方案類似。它只在我「放下」面板時才更新,而不是在移動時更新。 – bgoncalves 2008-12-03 03:58:52

+0

(你可以通過添加跟蹤到coordsChangedHandler()函數來測試它) – bgoncalves 2008-12-03 04:11:56

0

你想要覆蓋的UIComponent方法的updateDisplayList()在畫布上,做你的圖紙在那裏。

這是假設你熟悉線AS3在總圖。

+0

這並不完全是我的意思。我已經設法在新的位置重新繪製線條,但是這隻發生在我停止拖動mx:Panels之後。我希望重繪也可以在事物四處移動時發生。 – bgoncalves 2008-12-02 20:13:50

1

flexwires是一個開源項目,以實現這種類型的「連接線」在Flash UI範式。它可能只是適合你的需求。

0

你不能在這裏使用綁定功能嗎?線的終點與圓的中心相連?

0

新手閃光/彎曲和有類似的問題。我通過將事件監聽器附加到Enter_Frame事件來解決此問題。我不確定這是否是最有效的解決方案,因爲即使對象沒有移動,但它對我來說也是重繪的:

import flash.display.DisplayObject; 
import flash.display.Sprite; 
import flash.events.Event; 

public class Association extends Sprite 
{ 
    private var t1:DisplayObject; 
    private var t2:DisplayObject; 
    //Connects two objects 
    public function Association(t1:DisplayObject, t2:DisplayObject) 
    { 
     this.t1=t1; 
     this.t2=t2; 
     this.addEventListener(Event.ENTER_FRAME, redraw) 
     super(); 
    } 

    public function redraw(event:Event):void 
    { 
     graphics.clear(); 
     graphics.lineStyle(2,0x000000); 
     graphics.moveTo(t1.x,t1.y); 
     graphics.lineTo(t2.x,t2.y); 
    } 

}