我想在DisplayObject作为子项添加到DisplayObjectContainer时运行一些代码。或者换句话说,要捕捉所有DisplayObject的addedToStage事件,即使是我不知道的事件。有没有办法监听flash.display.DisplayObjectContainer numChildren属性中的更改?
可能吗?如果没有,关于如何做类似的任何想法?
我想在DisplayObject作为子项添加到DisplayObjectContainer时运行一些代码。或者换句话说,要捕捉所有DisplayObject的addedToStage事件,即使是我不知道的事件。有没有办法监听flash.display.DisplayObjectContainer numChildren属性中的更改?
可能吗?如果没有,关于如何做类似的任何想法?
一个 '添加' 每当子显示对象通过的addChild()或addChildAt添加至显示列表事件被调度() 。在DisplayObjectContainer类添加监听器:
addEventListener(Event.ADDED, onAdded);
和处理程序:
private function onAdded(e:Event):void
{
trace('number of children is now ' + numChildren);
}
我不知道是否有内置的方式来做到这一点。
替代品包括明显的,
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个图像,则只会运行一次。
使用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
干杯wpjmurray :) 不知何故,我认为此事件在对象本身添加一些其他容器的孩子。 (并且懒得检查我猜) – Leeron 2010-02-12 01:29:56
是的,使用“added”作为事件类型会引起混淆,因为“added_to_stage”意味着显示对象被添加到舞台上,所以“added”意味着此显示对象是添加到父显示对象。更好的事件类型应该是“child_added”或类似的。 – wpjmurray 2010-02-21 05:22:14