Flex DRAG_DROP事件 - 是否可以访问被拖动的图像?

时间:2008-10-20 09:19:44

标签: actionscript-3 flex

启动Flex拖动操作时,传入代理图像,以便在屏幕上拖动时显示。当发生丢弃时,我希望能够获取此代理但我无法从DragEvent对象中找到方法。

有可能吗?我想要的是在释放鼠标按钮时实际删除拖动的图像... Flex会自动在代理上执行一个很好的缩小动画,但我不希望这样。

Flex examples显示我不想要的内容 - 删除代理并添加新图片但不在正确的位置...

更多信息:我尝试将我的代理图像作为数据项添加到DragSource。我可以在发生丢弃时访问它,并看到有一个类mx.managers.dragClasses.DragProxy,它似乎有我需要的所有信息......但是这个类没有记录?

所以真的有两个问题......如何获取代理并找出代理中鼠标光标的位置,以及如何禁用Flex下拉动画。

9 个答案:

答案 0 :(得分:2)

dragProxy是DragManager上的静态getter,其范围限定为mx_internal。所以要参考它,你必须做这样的事情:

import mx_internal;

在拖动事件处理程序中:

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

我不确定你怎么能阻止动画。如果我发现了,我会告诉你的。

答案 1 :(得分:2)

要在s:List中禁用动画,在dragCompleteHandler覆盖中,您可以“入侵”DragManager以获取dragProxy并隐藏它。

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

可能适用于其他情况。

答案 2 :(得分:1)

阻止动画的唯一方法:

- 你必须修补DragProxy类的补丁(即创建一个具有相同名称,代码和包结构的新类),并从mouseUpHandler()中删除效果代码。

据我所知,没有其他方法可以覆盖它,尽管该问题已在一年前作为一个错误提交给Adobe。

答案 3 :(得分:1)

如果让代理的鼠标坐标放在正确的位置,请尝试:

假设您正在启动对mouseDown的拖动,请使用处理程序中的e.currentTarget.contentMouseX和e.currentTarget.contentMouseY来获取coords。然后将这些添加到dragSource(我将其作为对象),如:

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

然后在你的drop处理程序中(假设你将它放入名为drpCvs的Canvas中):

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

我在寻找摆脱收缩动画的方法时找到了这个,所以谢谢你。以为我是RTF。

答案 4 :(得分:0)

如果您只想阻止动画,最简单(最黑客)的方法是:创建您自己的代理并向舞台添加MOUSE_UP处理程序,触发时将代理的visible属性设置为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;
});

答案 5 :(得分:0)

@ykessler:谢谢你,猴子补丁就像一个魅力。 SDK: DragProxy.as

@Alvaro:我相信这种方法会导致竞争条件。我尝试过,它只在某些时候有效。

答案 6 :(得分:0)

我的解决方案是删除SandboxRoot上的MouseUp-Handler并在目标的dragEnterHandler中附加一个自己的MouseUp-Handler,如下所示:

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中,我从原始DragProxy.as实现了函数mouseUpHandler的副本,并删除了Drop-Effect。

答案 7 :(得分:0)

我关闭动画的解决方案是在我的自定义ListItemDragProxy组件中设置visible = 0 onMouseUp。

答案 8 :(得分:0)

设置

event.dragInitiator.visible = false;
拖放处理程序中的

对我有用!