Вы можете создать собственный класс DisplayObjectContainer
и переопределить методы addChild()
, addChildAt()
, removeChild()
, removeChildAt()
, чтобы они не только добавляли или удаляли экранный объект, но и переставляли все дочерние экранные объектыпозиции тоже.Я сделал пример, чтобы продемонстрировать это:
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.text.TextField;
public class Main extends Sprite
{
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}// end function
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
var vGroup:VGroup = new VGroup();
var blocks:Vector.<Sprite> = new Vector.<Sprite>();
for (var i:uint = 0; i < 5; i++)
{
blocks.push(getBlock(i + 1, 100, 100));
vGroup.addChild(blocks[i]);
}// end for
addChild(vGroup);
vGroup.removeChild(blocks[3]);
vGroup.removeChildAt(0);
vGroup.addChildAt(getBlock(6, 100, 100),1);
}// end function
private function getBlock(id:int, width:Number, height:Number):Sprite
{
var sprite:Sprite = new Sprite();
sprite.graphics.lineStyle(1, 0x000000);
sprite.graphics.beginFill(0xFFFF00);
sprite.graphics.drawRect(0, 0, width, height);
sprite.graphics.endFill();
var textField:TextField = new TextField();
textField.text = id.toString();
sprite.addChild(textField);
return sprite;
}// end function
}// end class
}// end package
import flash.display.DisplayObject;
import flash.display.Sprite;
internal class VGroup extends Sprite
{
override public function addChild(child:DisplayObject):DisplayObject
{
var displayobject:DisplayObject = super.addChild(child);
arrange();
return displayobject;
}// end function
override public function addChildAt(child:DisplayObject,
index:int):DisplayObject
{
var displayobject:DisplayObject = super.addChildAt(child, index);
arrange();
return displayobject;
}// end function
override public function removeChild(child:DisplayObject):DisplayObject
{
var displayobject:DisplayObject = super.removeChild(child);
arrange();
return displayobject;
}// end function
override public function removeChildAt(index:int):DisplayObject
{
var displayobject:DisplayObject = super.removeChildAt(index);
arrange();
return displayobject;
}// end function
private function arrange():void
{
if (numChildren > 0)
{
for (var i:uint = 0; i < numChildren; i++)
{
getChildAt(i).y = (i > 0) ? getChildAt(i - 1).y + getChildAt(i - 1).height : 0;
}// end for
}// end if
}// end function
}// end class
[ОБНОВЛЕНИЕ]
Каждая строка следующего кода:
vGroup.removeChild(blocks[3]); // removes block 4
vGroup.removeChildAt(0); // removes block 1
vGroup.addChildAt(getBlock(6, 100, 100),1); // adds block 6
производитследующие соответствующие выходы (кроме первого, который является начальным выходом):