如何正确监听Stage对象的事件·续

 

如果想在一个自定义类中注册对stage对象的监听事件,然后在另一个文档类中使用该类的实例,this.stage为null,正确做法应该如下:

package{
	
	import flash.display.Sprite;
	import flash.events.Event;
	
	public class MyClass extends Sprite{
		
		public function MyClass(){			
			trace(stage);//输出null			
			addEventListener(Event.ADDED_TO_STAGE,AddedToStageHandler);
		}
		
		function AddedToStageHandler(e:Event):void{
			trace(stage);//这时才能获得stage引用 
			stage.addEventListener(MouseEvent.MOUSE_DOWN,MouseDownHandler);		
		}
		
	}
}

 

然后把它实例化后显示出来

var myClass:MyClass = new MyClass();
addChild(myClass);//添加到显示列表
removeChild(myClass);//从显示列表中删除该对象

这种情况下,程序运行是正常的。

再来看一种情况

package{
	
	import flash.display.Sprite;
	import flash.events.Event;
	
	public class MyClass extends Sprite{
		
		public function MyClass(){			
			trace(stage);//输出null			
			addEventListener(Event.ADDED_TO_STAGE,AddedToStageHandler);
		}
		
		function AddedToStageHandler(e:Event):void{
			trace(stage);//这时才能获得stage引用 
			stage.addEventListener(MouseEvent.MOUSE_DOWN,MouseDownHandler);
            addEventListener(Event.ENTER_FRAME, onLoop);
		}
         function onLoop(e:Event):void
		{
            var y=stage.stageHeight;//这里引用了stage对象
        }
		
	}
}

 

然后把它实例化后显示出来

var myClass:MyClass = new MyClass();
addChild(myClass);//添加到显示列表
removeChild(myClass);//从显示列表中删除该对象 //报错了

 

原因是removeChild(myClass)后,myClass的onLoop方法所持有的stage未null了,正确的做法如下

package{
	
	import flash.display.Sprite;
	import flash.events.Event;
	
	public class MyClass extends Sprite{
		
		public function MyClass(){			
			trace(stage);//输出null			
			addEventListener(Event.ADDED_TO_STAGE,AddedToStageHandler);
            addEventListener(Event.REMOVED_FROM_STAGE,RemovedToStageHandler);//增加侦听移除Stage事件
		}
		
		function AddedToStageHandler(e:Event):void{
			trace(stage);//这时才能获得stage引用 
			stage.addEventListener(MouseEvent.MOUSE_DOWN,MouseDownHandler);
            addEventListener(Event.ENTER_FRAME, onLoop);
		}
        function onLoop(e:Event):void{
            var y=stage.stageHeight;//这里引用了stage对象
        }
		function RemovedToStageHandler(e:Event):void{
            removeEventListener(Event.ENTER_FRAME, onLoop);
        }
	}
}
posted @ 2010-09-02 01:41  rock506  阅读(450)  评论(0编辑  收藏  举报