舞台大小,屏幕大小和SWF文件尺寸大小之间的差异

/**
 * 第一次翻译东西放到网上,信达雅是谈不上,如果有错误希望大家指正,共同学习
 * E文链接http://www.ghostwire.com/blog/archives/as3-difference-between-stage-size-screen-size-and-swf-size/
 */

在这篇文章中,我们看三对经常被误解的的width和height属性—"stage.width/stage.height","stage.stageWidth/stage.stageHeight"和"loaderInfo.width/loaderInfo.height"。


舞台尺寸(Stage Size:stage.width / stage.height)

舞台(Stage)指的是Flash内容绘制的主区域。这个区域包含所有显示列表上的显示对象,因为所有的显示对象最终都包含在相同的Stage对象上。
stage.width和stage.height属性能给你提供舞台上矩形边界的尺寸。实际上调用getBounds()方法,你能得到同样的结果。

stage.width和stage.height属性能给你提供舞台上矩形边界的尺寸。实际上调用getBounds()方法,你能得到同样的结果。
var bounds:Rectangle = stage.getBounds(stage);
trace(bounds.width == stage.width);//true
trace(bounds.height == stage.height);//true
这些区域只计算了被显示对象占用的区域因此未必从原点(0,0)开始计算。例如,如果显示列表上只有一个显示对象且这个显示对象宽100像素高50像素,则stage.width属性返回100而不论该对象的x位置,同样的height属性返回50而不论该对象的y位置。
如果你想该区域从原点算起,可以在原点放置一个不可见点:
var dot:Shape = new Shape();
dot.graphics.beginFill(0,0);//黑色 透明
dot.graphics.drawRect(0,0,1,1);
dot.graphics.endFill();
stage.addChild(dot);

如果显示列表上什么都没有或者显示列表上所有的显示对象都为空(或者尺寸大小为0),那么stage.width和stage.height都返回0。这就是为什么在程序最最开始(显示列表上没有任何东西时),可以想见这这两个属性的值都为0。


(屏幕尺寸)Screen Size: stage.stageWidth / stage.stageHeight

stage.stageWidth和stage.stageHeight属性显示了flash player当前的可视区域(独立的窗口可视区域或浏览器的插件可视区域)。
尽管这些属性是可读可写的,但是在你的代码中手动设置他们却没有任何效果。用代码(手动)设置不会报错,但是很简单,这样做没有效果。通常是当最终用户(end-user)调整了flash player的大小才会(flash player调用)改变这些属性的值。通过监听Event.RESIZE事件,你的程序可以在这些属性值改变时收到通知,该事件由Stage对象派发。

stage.addEventListener(Event.RESIZE,on_stageResize);

function on_stageResize(evt:Event):void
{
	trace("screen width:" + stage.stageWidth);
	trace("screen height:" + stage.stageHeight);
}
Adobe的文档里说,如果你没有设置Stage.scaleMode属性为StageScaleMode.NO_SCALE,那么stage.stageWidth和stage.stageHeight属性就等于SWF文件的原始尺寸,也就是在编辑时在文件属性对话框中设置的尺寸大小。
然而,那不是真的。
与Adobe文档中描述的恰恰相反,stage.scaleMode属性对stage.stageWidth和stage.stageHeight属性没有任何影响。不管stage.scaleMode属性设置为什么值,StageScaleMode.NO_SCALE或者是别得也好,stage.stageHeight将总是(作者在这里进行了强调)为你提供(give you)当前被flash player所占据屏幕区域(screen area)的高度,而stage.stageWidth则返回该区域的宽度。首先要像文档中描述方式的一样实现(implements)这些值是错的(原文will have been wrong)(它使得结果令人困惑而且还没什么用),所以我会说这只是文档错误,而不是flash player的bug。

如果你想创建响应可视屏幕变化的弹性布局,那么了解当前的Flash Player大小是很有用的。当需要检查特定显示对象是否在可视区域界限之外时就需要用到这些值。


SWF区域大小 (SWF Size: loaderInfo.width / loaderInfo.height)

要得到SWF文件的原始width和height值,你必须使用loaderInfo.width和loaderInfo.height。他们是只读属性而且保持不变。这些值在编译时被硬编码到SWF文件中(在编辑时你指定大小)。Adobe的文档把这个尺寸称作"名义上的(nominal)"SWF文件大小。
访问这些属性之前必须等待SWF内容(content)成功的加载进来后才能访问:

loaderInfo.addEventListener(Event.COMPLETE,on_loadComplete);

function on_loadComplete(e:Event):void
{
	trace("swf width:" + loaderInfo.width);
	trace("swf height:" + loaderInfo.height);
}
如果你在加载外部的内容

var ldr:Loader = new Loader();
ldf.contentLoaderInfo.addEventListener(Event.COMPLETE,on_loadComplete);

function on_loadComplete(e:Event):void
{
	var ldrInfo:LoaderInfo = e.target as LoaderInfo;
	if(ldrInfo)
	{
		trace(ldrInfo.width);
		trace(ldrInfo.height);
	}
}
当你的应用(application)托管着外部SWFs模块时,知道SWF原始尺寸(nominal demensions)很有用,因为这时你可能想知道要为加载的SWF分配多少屏幕空间(假设你需要用到被硬编码进SWF的尺寸大小信息)。如果你想知道被加载进Loader对象里的内容(content)的原始宽高比(Loader对象的宽度和高度或许会被改变,但是loaderInfo.width和loaderInfo.height会总保持不变)。


结论(conclusion)

一般来讲,舞台(Stage)的大小,可视区域的大小以及SWF文件的原始尺寸大小三者之间没有什么联系。
如果你想要知道当前可视区域的确切大小,使用stage.stageWidth和stage.stageHeight。
如果你想知道SWF文件编译后的原始尺寸大小,使用loaderInfo.width和loaderInfo.height。
如果你想知道整个显示对象所占区域的综合大小,你可以用stage.width和stage.height属性(也能用是getBounds()或者getRect()方法)。
这三对属性很容易让人迷惑,因此希望上面的文章能够帮助你理清三者之间的不同。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值