有没有办法监听flash.display.DisplayObjectContainer numChildren属性的变化?

时间:2010-02-11 22:02:58

标签: actionscript-3 flex3

每当DisplayObject作为子对象添加到DisplayObjectContainer时,我想运行一些代码。 换句话说,要捕获所有DisplayObjects的addedToStage事件,即使是我不知道的事件。

有可能吗?如果没有,关于如何做类似事情的任何想法?

3 个答案:

答案 0 :(得分:3)

只要通过addChild()或addChildAt()将子显示对象添加到显示列表,就会调度'added'事件。在DisplayObjectContainer类中添加侦听器:

addEventListener(Event.ADDED, onAdded);

和处理程序:

private function onAdded(e:Event):void
{
    trace('number of children is now ' + numChildren);
}

答案 1 :(得分:1)

我不知道是否有内置方法可以做到这一点。

替代品包括显而易见的

private var _num_children:Number = 0;
addEventListener(Event.ENTER_FRAME, _checkChildren, false, 0, true);

private function _checkChildren($evt:Event):void {
    if (this.numChildren != _num_children) {
        _num_children = this.numChildren;
        // There was a child (or more) added in the last frame execution
    }
}

然而,这似乎是一个更优雅的解决方案...

public function _addChild($do:DisplayObject) {
    $do .addEventListener(Event.ADDED_TO_STAGE, _childAdded);
    addChild($do );
}

private function _childAdded($evt:Event) {
    // do whatever with $evt.target
}

这里的不同之处在于_childAdded将通过_addChild方法为每个添加的子项触发。这意味着如果您正在执行一些代价高昂的代码执行,那么您将为每个子实例执行一次。

如果使用第一种方法,则每帧只调用一次方法,如果在一帧上添加10张图像,则只运行一次。

答案 2 :(得分:1)

Event.ADDED_TO_STAGE对象上使用stage并将useCapture设置为true。

有关活动here

的更多信息

示例:

function onAdded(e:Event):void{
    trace(e.target.toString()); //use target to get the Object added
}
stage.addEventListener(Event.ADDED_TO_STAGE, onAdded, true); // set capture to true