AS3初学者容易迷糊的几个问题
1.Sprite/MovieClip的Enter_Frame事件,不受addChild/removeChild影響
簡單點講:Sprite或MovieClip對象一旦為其添加了Enter_Frame事件監聽,對應的Enter_Frame處理函數將會馬上被調用,并一直執行下去(不管你是否將其addChild到顯示列表,或者將其從顯示列表removeChild),直到該對象removeEventListener相應的監聽器為止。
同樣:MovieClip一旦被new出來,就會自動播放(在未用任何代碼stop()的前提下),不管你是否將其addChild或removeChild
注:其它事件也類似,在AS3的世界中,事件一旦被監聽,要想停止事件響應,唯一的方法只能是removeEventListener。(這一點跟c#中完全不同,在c#中不管是webform還是winform,一旦按鈕被disabled了,肯定就無法觸發按鈕的Click事件,但在AS3中,組件是否被禁用,跟組件是否能響應事件完全是沒有任何關聯的!)
測試代碼:
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);//實際上:程序執行到這里就會一直不停的跑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;//注意:即使把自身設置為null,原來注冊的onSpriteEnterFrame函數仍會一直執行,正確的方法只能用removeEventListener才能移除Enter_Frame事件//_sprite.removeEventListener(Event.ENTER_FRAME,onSpriteEnterFrame); }2.ADDED、ADDED_TO_STAGE、REMOVED、REMOVED_FROM_STAGE這幾個事件的區別
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]區別:
ADDED是子對象被添加到自身時觸發,ADDED_TO_STAGE是對象本身被添加到顯示列表時觸發;類似的:REMOVED當子對象從自身移除時觸發,REMOVED_FROM_STAGE是自身從顯示列表中移除時觸發;
ADDED/REMOVED事件會冒泡,而ADDED_TO_STAGE/REMOVED_FROM_STAGE不冒泡,也就是說每次addChild或removeChild自身時,下面的ADDED/REMOVED事件也會冒泡上來先被觸發,然后才觸發ADDED_TO_STAGE/REMOVED_FROM_STAGE事件.
轉載于:https://www.cnblogs.com/yjmyzz/archive/2010/07/06/1772458.html
總結
以上是生活随笔為你收集整理的AS3初学者容易迷糊的几个问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 奇或偶数行高亮显示及鼠标划过高亮显示类
- 下一篇: FastReport4.6程序员手册_翻