启动Flex拖动操作时,传入代理图像,以便在屏幕上拖动时显示。当发生丢弃时,我希望能够获取此代理但我无法从DragEvent对象中找到方法。
有可能吗?我想要的是在释放鼠标按钮时实际删除拖动的图像... Flex会自动在代理上执行一个很好的缩小动画,但我不希望这样。
Flex examples显示我不想要的内容 - 删除代理并添加新图片但不在正确的位置...
更多信息:我尝试将我的代理图像作为数据项添加到DragSource。我可以在发生丢弃时访问它,并看到有一个类mx.managers.dragClasses.DragProxy,它似乎有我需要的所有信息......但是这个类没有记录?
所以真的有两个问题......如何获取代理并找出代理中鼠标光标的位置,以及如何禁用Flex下拉动画。
答案 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;
拖放处理程序中的对我有用!