如何在画布上拖动复制的对象?

发布于 2024-10-21 02:40:59 字数 4331 浏览 4 评论 0原文

我可以使用 Flex 中的拖放管理器功能来拖动对象的副本并将其放在画布上。

原始对象保持不变,并创建该对象的新副本。 但是,如果我进一步想拖动此副本并将其放置在画布上的不同位置,我发现该对象不可拖动。

由于此副本是在运行时创建的,我不确定如何实现拖动它?

我的代码如下。

任何建议都会有所帮助。

<mx:Script>
    <![CDATA[
        import mx.managers.DragManager;
        import mx.core.DragSource;
        import mx.events.DragEvent;
        import flash.events.MouseEvent;

        // Embed icon image.
        [Embed(source='car.png')]
        public var globeImage:Class;

        // The mouseMove event handler for the Image control
        // functioning as the drag initiator.
        private function mouseOverHandler(event:MouseEvent):void 
        {                
            var dragInitiator:Image=Image(event.currentTarget);
            var ds:DragSource = new DragSource();
            ds.addData(dragInitiator, "img");               

            // The drag manager uses the image as the drag proxy
            // and sets the alpha to 1.0 (opaque),
            // so it appears to be dragged across the canvas.
            var imageProxy:Image = new Image();
            imageProxy.source = globeImage;
            imageProxy.height=10;
            imageProxy.width=10;                
            DragManager.doDrag(dragInitiator, ds, event, 
                imageProxy, -15, -15, 1.00);
        }

        // The dragEnter event handler for the Canvas container
        // functioning as the drop target.
        private function dragEnterHandler(event:DragEvent):void {
            if (event.dragSource.hasFormat("img"))
                DragManager.acceptDragDrop(Canvas(event.currentTarget));
        }

        // The dragOver event handler for the Canvas container
        // sets the type of drag-and-drop
        // operation as either copy or move. 
        // This information is then used in the 
        // dragComplete event handler for the source Canvas container.
        private function dragOverHandler(event:DragEvent):void
        {

            DragManager.showFeedback(DragManager.COPY);
                                                }

        // The dragDrop event handler for the Canvas container
        // sets the Image control's position by 
        // "dropping" it in its new location.
        private function dragDropHandler(event:DragEvent):void {
            if (event.dragSource.hasFormat("img")) {
                var draggedImage:Image = 
                    event.dragSource.dataForFormat('img') as Image;
                var dropCanvas:Canvas = event.currentTarget as Canvas;

                // Since this is a copy, create a new object to 
                // add to the drop target.
                var newImage:Image=new Image();
                newImage.source = draggedImage.source;
                newImage.x = dropCanvas.mouseX;
                newImage.y = dropCanvas.mouseY;
                dropCanvas.addChild(newImage);
            }
        }

        // The dragComplete event handler for the source Canvas container
        // determines if this was a copy or move.
        // If a move, remove the dragged image from the Canvas.
        private function dragCompleteHandler(event:DragEvent):void {
            var draggedImage:Image = 
                event.dragInitiator as Image;
            var dragInitCanvas:Canvas = 
                event.dragInitiator.parent as Canvas;

            if (event.action == DragManager.MOVE)
                dragInitCanvas.removeChild(draggedImage);
        }            
    ]]>
</mx:Script>

<!-- Canvas holding the Image control that is the drag initiator. --> 
<mx:Canvas 
    width="250" height="500"  
    borderStyle="solid" 
    backgroundColor="#DDDDDD">

    <!-- The Image control is the drag initiator and the drag proxy. -->
    <mx:Image id="myimg" 
              source="@Embed(source='car.png')" 
              mouseMove="mouseOverHandler(event);"
              dragComplete="dragCompleteHandler(event);"/> 
</mx:Canvas>

<!-- This Canvas is the drop target. --> 
<mx:Canvas
    width="250" height="500"  
    borderStyle="solid" 
    backgroundColor="#DDDDDD"
    dragEnter="dragEnterHandler(event);" 
    dragOver="dragOverHandler(event);"
    dragDrop="dragDropHandler(event);">        
</mx:Canvas>

I am able to drag a copy of an object and drop it on the canvas, using drag-drop manager functionality in Flex.

The original object remains unchanged and a new copy of the object is created.
However, If i further want to drag this copy and position it differently on the canvas, I find that the object is not draggable.

Since this copy is created at runtime, I am not sure how I can achieve to drag it?

My code is given below.

Any suggestions will help.

<mx:Script>
    <![CDATA[
        import mx.managers.DragManager;
        import mx.core.DragSource;
        import mx.events.DragEvent;
        import flash.events.MouseEvent;

        // Embed icon image.
        [Embed(source='car.png')]
        public var globeImage:Class;

        // The mouseMove event handler for the Image control
        // functioning as the drag initiator.
        private function mouseOverHandler(event:MouseEvent):void 
        {                
            var dragInitiator:Image=Image(event.currentTarget);
            var ds:DragSource = new DragSource();
            ds.addData(dragInitiator, "img");               

            // The drag manager uses the image as the drag proxy
            // and sets the alpha to 1.0 (opaque),
            // so it appears to be dragged across the canvas.
            var imageProxy:Image = new Image();
            imageProxy.source = globeImage;
            imageProxy.height=10;
            imageProxy.width=10;                
            DragManager.doDrag(dragInitiator, ds, event, 
                imageProxy, -15, -15, 1.00);
        }

        // The dragEnter event handler for the Canvas container
        // functioning as the drop target.
        private function dragEnterHandler(event:DragEvent):void {
            if (event.dragSource.hasFormat("img"))
                DragManager.acceptDragDrop(Canvas(event.currentTarget));
        }

        // The dragOver event handler for the Canvas container
        // sets the type of drag-and-drop
        // operation as either copy or move. 
        // This information is then used in the 
        // dragComplete event handler for the source Canvas container.
        private function dragOverHandler(event:DragEvent):void
        {

            DragManager.showFeedback(DragManager.COPY);
                                                }

        // The dragDrop event handler for the Canvas container
        // sets the Image control's position by 
        // "dropping" it in its new location.
        private function dragDropHandler(event:DragEvent):void {
            if (event.dragSource.hasFormat("img")) {
                var draggedImage:Image = 
                    event.dragSource.dataForFormat('img') as Image;
                var dropCanvas:Canvas = event.currentTarget as Canvas;

                // Since this is a copy, create a new object to 
                // add to the drop target.
                var newImage:Image=new Image();
                newImage.source = draggedImage.source;
                newImage.x = dropCanvas.mouseX;
                newImage.y = dropCanvas.mouseY;
                dropCanvas.addChild(newImage);
            }
        }

        // The dragComplete event handler for the source Canvas container
        // determines if this was a copy or move.
        // If a move, remove the dragged image from the Canvas.
        private function dragCompleteHandler(event:DragEvent):void {
            var draggedImage:Image = 
                event.dragInitiator as Image;
            var dragInitCanvas:Canvas = 
                event.dragInitiator.parent as Canvas;

            if (event.action == DragManager.MOVE)
                dragInitCanvas.removeChild(draggedImage);
        }            
    ]]>
</mx:Script>

<!-- Canvas holding the Image control that is the drag initiator. --> 
<mx:Canvas 
    width="250" height="500"  
    borderStyle="solid" 
    backgroundColor="#DDDDDD">

    <!-- The Image control is the drag initiator and the drag proxy. -->
    <mx:Image id="myimg" 
              source="@Embed(source='car.png')" 
              mouseMove="mouseOverHandler(event);"
              dragComplete="dragCompleteHandler(event);"/> 
</mx:Canvas>

<!-- This Canvas is the drop target. --> 
<mx:Canvas
    width="250" height="500"  
    borderStyle="solid" 
    backgroundColor="#DDDDDD"
    dragEnter="dragEnterHandler(event);" 
    dragOver="dragOverHandler(event);"
    dragDrop="dragDropHandler(event);">        
</mx:Canvas>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

森林很绿却致人迷途 2024-10-28 02:40:59

dragDropHandler 方法更改为:

private function dragDropHandler(event:DragEvent):void {
    if (event.dragSource.hasFormat("img")) {
        var draggedImage:Image = 
            event.dragSource.dataForFormat('img') as Image;
        var dropCanvas:Canvas = event.currentTarget as Canvas;

        // Since this is a copy, create a new object to 
        // add to the drop target.
        var newImage:Image=new Image();
        newImage.source = draggedImage.source;
        newImage.x = dropCanvas.mouseX;
        newImage.y = dropCanvas.mouseY;
        newImage.addEventListener(MouseEvent.MOUSE_MOVE, mouseOverHandler);
        newImage.addEventListener(DragEvent.DRAG_COMPLETE, dragCompleteHandler);
        dropCanvas.addChild(newImage);
    }
}

Change the dragDropHandler method to:

private function dragDropHandler(event:DragEvent):void {
    if (event.dragSource.hasFormat("img")) {
        var draggedImage:Image = 
            event.dragSource.dataForFormat('img') as Image;
        var dropCanvas:Canvas = event.currentTarget as Canvas;

        // Since this is a copy, create a new object to 
        // add to the drop target.
        var newImage:Image=new Image();
        newImage.source = draggedImage.source;
        newImage.x = dropCanvas.mouseX;
        newImage.y = dropCanvas.mouseY;
        newImage.addEventListener(MouseEvent.MOUSE_MOVE, mouseOverHandler);
        newImage.addEventListener(DragEvent.DRAG_COMPLETE, dragCompleteHandler);
        dropCanvas.addChild(newImage);
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文