2008-10-20 48 views
3

當您開始一個Flex拖動動作時,您將傳入一個代理圖像,以便在屏幕上拖動時進行顯示。當發生丟棄時,我希望能夠獲得這個代理,但我找不到從DragEvent對象的方式。Flex DRAG_DROP事件 - 是否可以訪問被拖動的圖像?

可能嗎?我想要的是在釋放鼠標按鈕的時候實際拖放拖動的圖像... Flex會自動在代理上縮小動畫,但我不希望這樣做。

Flex examples節目我不想要什麼 - 代理被刪除,添加了新的形象,但不完全正確的地方...

更多信息:我嘗試添加我的代理圖像作爲數據項到DragSource。我能夠訪問這個時發生的下降,看到有一個類mx.managers.dragClasses.DragProxy似乎有我需要的所有信息...但這個類沒有記錄?

所以這裏有兩個問題......如何獲取代理並找出代理中鼠標光標的位置以及如何禁用Flex下拉動畫。

回答

2

dragProxy是DragManager上的一個靜態獲取器,其作用域爲mx_internal。因此,要引用它,你必須做這樣的事情:

import mx_internal; 

而且在拖放事件處理程序:

var p:* = DragManager.mx_internal::dragProxy; 

我不知道你怎麼能防止動畫。如果我知道,我會讓你知道的。

1

只是爲了防止動畫方式:

- 你必須猴子修補DragProxy類(即創建具有相同的名稱,代碼和封裝結構的新類),並從mouseUpHandler去除效果代碼( )。

就我所知,沒有其他方式可以覆蓋它,儘管該問題在一年前已經作爲Adobe提交的漏洞提交。

0

如果您只是想阻止動畫,最簡單的方法是:創建您自己的代理並將MOUSE_UP處理程序添加到觸發時將代理的可見屬性設置爲false的階段。它不會實際停止動畫,它只會在動畫發生時隱藏代理。事情是這樣的:

var proxy:UIComponent = new UIComponent(); 
proxy.graphics.lineStyle(1); 
proxy.graphics.beginFill(0xccddff); 
proxy.graphics.drawRect(0, 0, main.width, main.height); 
stage.addEventListener(MouseEvent.MOUSE_UP, function (e:MouseEvent):void { 
    proxy.visible = false; 
}); 
1

至於讓鼠標COORDS爲代理砸在正確的位置試試這個:

假設你正在發起對鼠標按下拖拽得到使用e.currentTarget的COORDS .contentMouseX和e.currentTarget.contentMouseY在您的處理程序中。然後將這些添加到DragSource(我這樣做是爲對象),如:

var drgSrc:DragSource = new DragSource(); 
drgSrc.addData({ x:e.currentTarget.contentMouseX, y:e.currentTarget.contentMouseY }, 'drgXY'); 

然後在降處理器(假設你拖放到畫布名爲drpCvs):

var newImg:Image = new Image(); 
newImg.x = drpCvs.contentMouseX - e.dragSource.dataForFormat('drgXY').x; 
newImg.y = drpCvs.contentMouseY - e.dragSource.dataForFormat('drgXY').y; 

我發現這同時尋找一種方法來擺脫縮小動畫,所以謝謝你。以爲我會RTF。

+0

謝謝,這是有幫助的,在我最終整理動畫後,一些元素稍微偏離了:-) – penfold 2011-08-26 05:28:44

0

@ykessler:謝謝你,猴子補丁像一個魅力工作。 SDK: DragProxy.as

@Alvaro:我相信這種方法會導致競爭狀況。我試過了,它只是有時候有效。

0

我的解決方法是刪除的sandboxRoot上鼠標鬆開處理程序和dragEnterHandler附加目標這樣的自己的MouseUp處理程序:

protected function dragEnterHandler(event:DragEvent):void{ 

     DragManager.acceptDragDrop(this); 

     this.dragProxy = DragManager.mx_internal::dragProxy;// get drag proxy 

     var sm:ISystemManager = event.dragInitiator.systemManager.topLevelSystemManager as ISystemManager; 
     var ed:IEventDispatcher = sm.getSandboxRoot(); 
     this.sandboxRoot = sm.getSandboxRoot(); 
     //remove 
     ed.removeEventListener(MouseEvent.MOUSE_UP, dragProxy.mouseUpHandler, true); 

     //attach own 
     ed.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler, true); 
     ed.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler); 

     this.dragInitiator = event.dragInitiator;} 

在mouseUpHandler我實現了功能mouseUpHandler的副本從原來的DragProxy.as並刪除了Drop-Effect。

0

我關閉動畫的解決方案是在我的自定義ListItemDragProxy組件中設置visible = 0 onMouseUp。

0

設置

event.dragInitiator.visible = false; 

在拖放處理程序對我的作品!

+0

我發現你可以通過偵聽你提供給DragManager的拖拽代理圖像上的Event.REMOVED來恢復可見性。 doDrag(...)。在我的情況下,應該顯示動畫,但是因爲我隱藏了拖動的組件(並使用拖動代理來表示它),當它被放置在無效位置時,「回彈」動畫會在我恢復後生成動畫DragEvent.DRAG_COMPLETE中的可見性。 – penfold 2011-08-25 10:57:53

2

要禁用s:List中的動畫,在dragCompleteHandler覆蓋中,您可以'拖入'DragManager以獲取dragProxy並隱藏它。

override protected function dragCompleteHandler(e:DragEvent):void 
{ 
    DragManager.mx_internal::dragProxy.visible = false; // <- MAGIC! 
    super.dragCompleteHandler(e); 
} 

可能適用於其他情況。

相關問題