AS3初学者容易迷糊的几个问题
1.Sprite/MovieClip的Enter_Frame事件,不受addChild/removeChild影響
簡單點(diǎn)講:Sprite或MovieClip對象一旦為其添加了Enter_Frame事件監(jiān)聽,對應(yīng)的Enter_Frame處理函數(shù)將會馬上被調(diào)用,并一直執(zhí)行下去(不管你是否將其addChild到顯示列表,或者將其從顯示列表removeChild),直到該對象removeEventListener相應(yīng)的監(jiān)聽器為止。
同樣:MovieClip一旦被new出來,就會自動播放(在未用任何代碼stop()的前提下),不管你是否將其addChild或removeChild
注:其它事件也類似,在AS3的世界中,事件一旦被監(jiān)聽,要想停止事件響應(yīng),唯一的方法只能是removeEventListener。(這一點(diǎn)跟c#中完全不同,在c#中不管是webform還是winform,一旦按鈕被disabled了,肯定就無法觸發(fā)按鈕的Click事件,但在AS3中,組件是否被禁用,跟組件是否能響應(yīng)事件完全是沒有任何關(guān)聯(lián)的!)
測試代碼:
var _sprite:Sprite = new Sprite(); _sprite.graphics.lineStyle(1,0); _sprite.graphics.beginFill(0xff0000); _sprite.graphics.drawCircle(0,0,50); _sprite.graphics.endFill();_sprite.addEventListener(Event.ENTER_FRAME,onSpriteEnterFrame);//實(shí)際上:程序執(zhí)行到這里就會一直不停的跑onSpriteEnterFrame了function onSpriteEnterFrame(e:Event):void{trace("我是_Sprite",getTimer()); }addChild(_sprite); _sprite.x = stage.stageWidth/2 ; _sprite.y = stage.stageHeight/2 ;_sprite.addEventListener(MouseEvent.CLICK,onSpriteMouseClick);function onSpriteMouseClick(e:MouseEvent):void{removeChild(_sprite);//移除自己 _sprite=null;//注意:即使把自身設(shè)置為null,原來注冊的onSpriteEnterFrame函數(shù)仍會一直執(zhí)行,正確的方法只能用removeEventListener才能移除Enter_Frame事件//_sprite.removeEventListener(Event.ENTER_FRAME,onSpriteEnterFrame); }2.ADDED、ADDED_TO_STAGE、REMOVED、REMOVED_FROM_STAGE這幾個事件的區(qū)別
var _container:Sprite = new Sprite();_container.addEventListener(Event.ADDED,onAdded); _container.addEventListener(Event.ADDED_TO_STAGE,onAddedToStage); _container.addEventListener(Event.REMOVED,onRemoved); _container.addEventListener(Event.REMOVED_FROM_STAGE,onRemovedFromStage);function onAdded(e:Event):void {trace("onAdded:",e); }function onAddedToStage(e:Event):void {trace("onAddedToStage:",e); }function onRemoved(e:Event):void {trace("onRemoved:",e); }function onRemovedFromStage(e:Event):void {trace("onRemovedFromStage:",e); }addChild(_container); //onAdded: [Event type="added" bubbles=true cancelable=false eventPhase=2] //onAddedToStage: [Event type="addedToStage" bubbles=false cancelable=false eventPhase=2]var _sub:Sprite = new Sprite();_container.addChild(_sub); //onAdded: [Event type="added" bubbles=true cancelable=false eventPhase=3]/*_container.removeChild(_sub); //onRemoved: [Event type="removed" bubbles=true cancelable=false eventPhase=3]*/removeChild(_container); //onRemoved: [Event type="removed" bubbles=true cancelable=false eventPhase=2] //onRemovedFromStage: [Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2]_container.removeChild(_sub); //onRemoved: [Event type="removed" bubbles=true cancelable=false eventPhase=3]區(qū)別:
ADDED是子對象被添加到自身時觸發(fā),ADDED_TO_STAGE是對象本身被添加到顯示列表時觸發(fā);類似的:REMOVED當(dāng)子對象從自身移除時觸發(fā),REMOVED_FROM_STAGE是自身從顯示列表中移除時觸發(fā);
ADDED/REMOVED事件會冒泡,而ADDED_TO_STAGE/REMOVED_FROM_STAGE不冒泡,也就是說每次addChild或removeChild自身時,下面的ADDED/REMOVED事件也會冒泡上來先被觸發(fā),然后才觸發(fā)ADDED_TO_STAGE/REMOVED_FROM_STAGE事件.
轉(zhuǎn)載于:https://www.cnblogs.com/yjmyzz/archive/2010/07/06/1772458.html
總結(jié)
以上是生活随笔為你收集整理的AS3初学者容易迷糊的几个问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 奇或偶数行高亮显示及鼠标划过高亮显示类
- 下一篇: FastReport4.6程序员手册_翻