最近在做项目的时候,碰见一个奇怪的现象,自己研究了下,发现对于Event.REMOVED&Event.ENTER_FRAME 自己的认识还不足,对于细节还不是很清楚,相信和我有同一毛病的小菜不再少数,所以发帖给大家提个醒.....
从前一直认为Event.ENTER_FRAME事件是 Sprite对象进入帧事件,当对象被移除(removeChild)的时候 就应该自动停止这个事件,直到对应的对象重新被加入场景中......
这是本人的第一个误区,经测试,对象被移除 事件依旧在执行,参看例子中的test0.fla
代码:
//场景中的一个mc 默认已添加进舞台
mc.addEventListener("fuck",traceKao);
function traceKao(evt:Event){
trace("Kao");
}
mc.addEventListener(Event.ENTER_FRAME,removeMc);
function removeMc(evt:Event){
trace(mc.currentFrame)
if(mc.currentFrame == 5){
this.removeChild(mc);
}
}
误区二:当对象是MovieClip类被移除后,将会停止本身影片剪辑的播放.....
实践证明,虽然不现实了,但内部逻辑依旧在播放中........参看例子中的test1.fla
代码:
mc.addEventListener("fuck",traceKao);
function traceKao(evt:Event){
trace("Kao");
}
mc.addEventListener(Event.ENTER_FRAME,removeMc);
function removeMc(evt:Event){
trace(mc.currentFrame)
if(mc.currentFrame == 5){
this.removeChild(mc);
}
}
mc.addEventListener(Event.REMOVED,removeHandler);
function removeHandler(evt:Event){
trace("元件被移除");
mc.removeEventListener(Event.ENTER_FRAME,removeMc);
mc.removeEventListener("fuck",traceKao)
}
mc.addEventListener(Event.ADDED,addHandler);
function addHandler(evt:Event){
trace("元件被添加");
}
2
3
4
5
元件被移除
元件被移除
元件被添加
mc播放完毕
元件被移除
元件被添加
元件被移除
元件被添加
mc播放完毕
元件被移除
元件被添加
......
影片剪辑不停的在播放,并且在第一帧的时候触发一次添加时间,在第五帧(只触发一次,因为被移除ENTER_FRAME事件了)的时候触发一次移除事件,在最后一帧又触发一次移除事件......
尝试在mc最后一帧加入stop();并删除移除函数 则输出为
2
3
4
............
元件被移除
[object Shape],[object testMC_1]
元件被添加
mc播放完毕
///end
参看例子test2.fla
得出结论,原来的MovieClip被替换成Shape对象了,大概是flash播放器节省资源的策略吧........
大家可以尝试把stop()指令前移一帧,则不会发生元件移除事件,MovieClip类对象继续以MovieClip对象存在......
还有一些感觉有些头绪,有有些乱的思维,等整理后在发表意见吧,
根据两点误区 总结:
ENTER_FRAME 要慎用,因为占用资源,然后要合理的删除,并不是已移除对象当做删除侦听器的方式
removeChild掉MoviClip对象后,要注意先停止掉MoviClip对象的播放,防止发生逻辑问题.....欢迎高手指点,和指明其中我没想明白 或者没想透的地方 谢谢
根据楼上的意思,是不是要销毁一个对象,只要removeChild(a);a=null;就可以了,a的enterFrame侦听也不用remove了?????