我想在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