注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

金融IT小鸿的博客

致力于金融IT行业

 
 
 

日志

 
 
关于我

Organize the world's information I care about and share it with other people! Change the Financial Industry through Information Technology! 爱互联网,爱金融, 爱分享,爱运动, 也爱偶尔胡思乱想! 我是金融IT小鸿

网易考拉推荐

Flex的Stage类的使用问题  

2010-08-04 10:21:17|  分类: AS & Flex |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
       最近在研究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, 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, 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, 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, 0, 100);
eventSprite.x = stage.stageWidth / 2; 
eventSprite.y = stage.stageHeight / 2; 
}
}
}
  评论这张
 
阅读(2338)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017