Flex的Stage类的使用问题
发布时间:2020-12-15 04:41:06 所属栏目:百科 来源:网络整理
导读:最近在研究flash动画制作,很多地方要用到舞台显示位置的控制,这时候就需要使用Stage类。在测试一些实例代码的过程中,总是会报“TypeError: Error #1009:无法访问空对象引用的属性和方法”。案例代码如下: EventDemo.as文件: package ch02{ import flash
最近在研究flash动画制作,很多地方要用到舞台显示位置的控制,这时候就需要使用Stage类。在测试一些实例代码的过程中,总是会报“TypeError: Error #1009:无法访问空对象引用的属性和方法”。案例代码如下: EventDemo.as文件: package ch02{ import flash.display.Sprite; import flash.display.Stage; import flash.events.Event; import flash.events.MouseEvent; public class EventDemo extends Sprite { private var eventSprite:Sprite; public function EventDemo() { init(); } private function init():void { eventSprite = new Sprite(); addChild(eventSprite); eventSprite.graphics.beginFill(0xff0000); eventSprite.graphics.drawCircle(0,100); eventSprite.x = stage.stageWidth / 2; eventSprite.y = stage.stageHeight / 2; } } } FlashAnimation.as文件: package { import ch02.*; import flash.display.Sprite; public class FlashAnimation extends Sprite { public function FlashAnimation() { init(); } public function init():void{ testCh02(); } public function testCh02():void { var EntDm:EventDemo = new EventDemo(); addChild(EntDm); } } } ??????? FlashAnimation.as是主程序文件,在运行的时候会在“eventSprite.x = stage.stageWidth / 2;”这一行报空对象的错误。一开始我还以为是eventSprite为空,后来发现不对,应该是Stage的问题。上网查了查资料终于找到了问题的所在。原来在flash中,Stage 表示显示 Flash 内容的整个区域一个对象,无法以全局方式访问 Stage 对象。而是需要利用 DisplayObject 实例的? stage ?属性进行访问。也就是说,必须是在显示列表中的类才能访问stage属性。可以通过addChild将要显示的组件添加到显示列表中,而本实例中,对stage属性的访问是在EventDemo类的构造方法中,就是在new?EventDemo()的时候,这个时候EventDemo类还没有添加到显示列表中,所以就造成了无法访问空对象引用的属性和方法的错误。通过查资料,目前发现了两种解决办法: 一种方法是在构造方法中将stage属性作为参数传递给EventDemo类,代码如下: EventDemo.as文件: package ch02{ import flash.display.Sprite; import flash.display.Stage; import flash.events.Event; import flash.events.MouseEvent; public class EventDemo extends Sprite? { private var eventSprite:Sprite; public function EventDemo(stage:Stage) { init(stage); } private function init(stage:Stage):void? { eventSprite = new Sprite(); addChild(eventSprite); eventSprite.graphics.beginFill(0xff0000); eventSprite.graphics.drawCircle(0,100); eventSprite.x = stage.stageWidth / 2; eventSprite.y = stage.stageHeight / 2; } } } FlashAnimation.as文件: package { import ch02.*; import flash.display.Sprite; public class FlashAnimation extends Sprite { public function FlashAnimation() { init(); } public function init():void{ testCh02(); } public function testCh02():void { var EntDm:EventDemo = new EventDemo(this.stage); addChild(EntDm); } } } 另一种方法是使用addToStage事件,将用到stage属性的代码添加到此事件的处理函数中,代码如下: EventDemo.as文件: package ch02{ import flash.display.Sprite; import flash.display.Stage; import flash.events.Event; import flash.events.MouseEvent; public class EventDemo extends Sprite? { private var eventSprite:Sprite; public function EventDemo() { init(); } private function init():void? { eventSprite = new Sprite(); addChild(eventSprite); eventSprite.graphics.beginFill(0xff0000); eventSprite.graphics.drawCircle(0,100); this.addEventListener(Event.ADDED_TO_STAGE,addToStageHandle); } private function addToStageHandle(event:Event):void {? eventSprite.x = stage.stageWidth / 2;? eventSprite.y = stage.stageHeight / 2;? } } } Update(2011-09-06): ? ? ? ?前段时间看到一种有关此问题的标准解决方案,也是一种更加规范的写法。现在回看自己当年写的代码,的确很粗糙,标准写法如下: EventDemo.as文件: package ch02{ import flash.display.Sprite; import flash.display.Stage; import flash.events.Event; import flash.events.MouseEvent; public class EventDemo extends Sprite? { private var eventSprite:Sprite; public function EventDemo() { if(stage)?init(); else?this.addEventListener(Event.ADDED_TO_STAGE,init); } private function init():void? { this.removeEventListener(Event.ADDED_TO_STAGE,init); eventSprite = new Sprite(); addChild(eventSprite); eventSprite.graphics.beginFill(0xff0000); eventSprite.graphics.drawCircle(0,100); eventSprite.x = stage.stageWidth / 2;? eventSprite.y = stage.stageHeight / 2;? } } }
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |