【问题标题】:Flex DRAG_DROP Event - Is it possible to access the Image Being Dragged?Flex DRAG_DROP 事件 - 是否可以访问被拖动的图像?
【发布时间】:2008-10-20 09:19:43
【问题描述】:

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

有可能吗?我想要的是在释放鼠标按钮时实际放下拖动的图像...... Flex 会自动在代理上做一个很好的收缩动画,但我不想要那个。

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

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

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

【问题讨论】:

    标签: actionscript-3 apache-flex


    【解决方案1】:

    dragProxy 是 DragManager 上的静态 getter,其作用域为 mx_internal。所以要引用它,你必须做这样的事情:

    import mx_internal;
    

    在拖动事件处理程序中:

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

    我不确定您如何阻止动画。如果我知道了,我会告诉你的。

    【讨论】:

      【解决方案2】:

      为了禁用 s:List 中的动画,在 dragCompleteHandler 覆盖中,您可以“破解”到 DragManager 以获取 dragProxy 并将其隐藏。

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

      可能适用于其他情况。

      【讨论】:

        【解决方案3】:

        阻止动画的唯一方法:

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

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

        【讨论】:

          【解决方案4】:

          至于让代理的鼠标坐标将其放置在正确的位置,试试这个:

          假设您在 mouseDown 上启动拖动,在您的处理程序中使用 e.currentTarget.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。

          【讨论】:

          • 谢谢,帮了大忙,终于把动画整理出来后,有些元素有点不对劲:-)
          【解决方案5】:

          如果你只是想阻止动画,最简单(hackiest)的方法是:创建你自己的代理并添加一个 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;
          });
          

          【讨论】:

            【解决方案6】:

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

            @Alvaro:我相信这种方法会导致竞争条件。我试过了,它只是有时有效。

            【讨论】:

              【解决方案7】:

              设置

              event.dragInitiator.visible = false;
              

              在拖放处理程序中为我工作!

              【讨论】:

              • 我发现您可以通过在您提供给 DragManager.doDrag(...) 的拖动代理图像上侦听 Event.REMOVED 来恢复可见性。在我的情况下,应该显示动画,但是因为我隐藏了拖动的组件(并使用拖动代理来表示它),当它被放置在无效位置时,“回弹”动画会在我恢复后动画DragEvent.DRAG_COMPLETE 中的可见性。
              【解决方案8】:

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

              【讨论】:

                【解决方案9】:

                我的解决方案是删除 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。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-03-25
                  • 1970-01-01
                  • 2019-09-04
                  • 2014-09-12
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多