如何将Image对象动态添加到显示器然后与它们交互?

时间:2010-01-13 17:09:24

标签: flex flash

以下是我在Flex应用中使用的模块的示例代码。我想动态创建mx.controls.Image对象并将它们添加到显示中。我希望用户能够移动它们(这可以如下工作)并且能够在移回数据库之后更改其z-index以及记录新的X和Y坐标。如何确定this.getChildren()中的哪个对象是用户正在使用的“选定”项?例如,当我添加MOUSE_OVER事件时,它不起作用。

<?xml version="1.0" encoding="utf-8"?>

             

        import flash.display.DisplayObject;
        import flash.events.MouseEvent;
        import mx.controls.Image;

        public var draggedObject:DisplayObject;
        public var selectedObject:DisplayObject;
        public var offsetX:Number;
        public var offsetY:Number;


        public function Add():void
        {
            var _image:Image = new Image;
            _image.source = "myimage.png";
            _imagem.x = 100;
            _image.y = 100;
            _image.addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
            _image.addEventListener(MouseEvent.MOUSE_UP, stopDragging);
            this.addChild(_image);
        }

        // This function is called when the mouse button is pressed.
        public function startDragging(event:MouseEvent):void
        {
            // remember which object is being dragged
            draggedObject = DisplayObject(event.target);
            selectedObject = draggedObject;

            // Record the difference (offset) between where the cursor was when
            // the mouse button was pressed and the x, y coordinate of the
            // dragged object when the mouse button was pressed.
            offsetX = event.stageX - draggedObject.x;
            offsetY = event.stageY - draggedObject.y;

            // move the selected object to the top of the display list
            //stage.addChild(draggedObject);

            // Tell Flash Player to start listening for the mouseMove event.
            stage.addEventListener(MouseEvent.MOUSE_MOVE, dragObject);                  
        }

        // This function is called when the mouse button is released.
        public function stopDragging(event:MouseEvent):void
        {
            // Tell Flash Player to stop listening for the mouseMove event.
            stage.removeEventListener(MouseEvent.MOUSE_MOVE, dragObject);
        }

        // This function is called every time the mouse moves,
        // as long as the mouse button is pressed down.
        public function dragObject(event:MouseEvent):void
        {
            // Move the dragged object to the location of the cursor, maintaining 
            // the offset between the cursor's location and the location 
            // of the dragged object.
            draggedObject.x = event.stageX - offsetX;
            draggedObject.y = event.stageY - offsetY;

            // Instruct Flash Player to refresh the screen after this event.
            event.updateAfterEvent();
        }
    ]]>
</mx:Script>
<mx:Button x="83" y="93" label="New Image" click="this.Add()"/>
<mx:Label x="83" y="138" id="label1"/>
<mx:Label x="83" y="164" id="label2"/>

1 个答案:

答案 0 :(得分:4)

  1. 在DisplayObject上使用startDragstopDrag方法,您将避免自行执行此操作
  2. numChildren会在显示列表中显示子项数
  3. getChildIndex将为您提供显示列表中对象的索引
  4. setChildIndex / swapChildren可用于将“z-index”更改为显示列表
  5. 因此,混合使用这些不同的功能可能会导致:

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script>
    <![CDATA[
        import mx.controls.Image;
    
        private function addImage() : void {
            var img : Image = new Image();
            img.source = imgClass;
            img.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown, false, 0, true);
            canvas.addChild(img);
        }
    
        private function onMouseUp(e : MouseEvent) : void {
            var img : Image = e.currentTarget as Image;
            if (img !== null) {
                stopDrag();
                img.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
            }
        }
    
        private function onMouseDown(e : MouseEvent) : void {
            var img : Image = e.currentTarget as Image;
            if (img !== null) {
                var parent : DisplayObjectContainer = img.parent;
    
               // get the index of the image and do what you want with it
                var idxImg : int = parent.getChildIndex(img);
    
               // put the clicked object on top of the list
                parent.setChildIndex(img, parent.numChildren - 1);
    
                img.addEventListener(MouseEvent.MOUSE_UP, onMouseUp, false, 0, true);
                img.startDrag();
            }
        }
    
        [Embed(source="assets/logo.png")]
        private var imgClass : Class;
    ]]>
    </mx:Script>
    <mx:Canvas id="canvas">
        <mx:Button label="add" click="addImage()"></mx:Button>
    </mx:Canvas>
    </mx:Application>
    
相关问题