首页 > 代码库 > Flex 4 stage.scaleMode 详解

Flex 4 stage.scaleMode 详解

桌面Flex项目:

影响桌面Flex项目缩放方式的因素有4个:初始窗口尺寸、SWF尺寸、stage.scaleMode、stage.align。

桌面程序的初始窗口尺寸在app.xml中通过修改width、height节点值来设置。如省略设置,则默认窗口尺寸为508×409(除去窗口镶边和标题栏的尺寸,内容尺寸为500×375)

SWF尺寸,通过在主Application中添加 如下元数据便签 来设置

<fx:Metadata>
    [SWF(width=800,height=600,backgroundColor=0xcccccc]
</fx:Metadata>

或在Flex项目属性——Flex编译器——附加的编译器参数中 添加 -default-size 800 600 

(默认颜色用 -default-background-color=0xCCCCFF)来设置,省略设置,则默认SWF尺寸为500×375

注:Flex项目中,Application的initialize和creationComplete事件处理函数中,this.stage均为null,要设置stage.align和stage.scaleMode,必须通过systemManager.stage.align和systemManager.stage.scaleMode来设置,下文中,凡是对stage相关属性的设置,实际代码均写为systemManager.stage.xxxx=xxxx,简写为stage.xxxx=xxxx,后文不再赘述。

1、窗口尺寸、SWF尺寸、stage.align、stage.scaleMode缺省设置(使用默认值)

当省略设置窗口尺寸和SWF尺寸时,窗口尺寸默认为508×409,SWF尺寸(Stage尺寸)、Application尺寸自动填满窗口内部区域(即窗口尺寸减去窗口镶边和标题栏后的尺寸)为500×375

默认的对齐和缩放方式如下:

stage.align=StageAlign.TOP_LEFT(“TL”),

stage.scaleMode=StageScaleMode.NO_SCALE(“noScale”)

在默认的缩放(“noScale”)和对齐模式(“TL”)下,当拖动窗口边沿、点击最大化/最小化/还原按钮 改变窗口尺寸时,stage会调度Event.RESIZE事件,SWF(舞台)尺寸、Application尺寸会填满为新的窗口大小减去窗口镶边后的尺寸

使用stage.displayState=StageDisplayState.FULL_SCREEN_INTERACTIVE;让窗口全屏,stage同样也会调度Event.RESIZE事件。舞台尺寸刷新为全屏后的显示器尺寸。

舞台上的元素不会随舞台(窗口)尺寸的改变而改变尺寸和位置。

2、窗口尺寸、SWF尺寸、stage.scaleMode缺省设置,stage.align设置为"TL"以外的值。

当省略设置窗口尺寸和SWF尺寸时,窗口尺寸默认为508×409,SWF尺寸(Stage尺寸)、Application尺寸自动填满窗口内部区域(即窗口尺寸减去窗口镶边和标题栏后的尺寸)为500×375

在默认缩放(“noScale”),对齐模式设置为“TL”以外的值时,改变窗口尺寸,则SWF(舞台)尺寸、Application尺寸仍自动填满窗口内部尺寸,但SWF的对齐方式似乎存在Bug,选T、TR时,SWF内容总是存在一个向右的偏差,选BL、L时,存在向下的偏差,选R、B、BR、“(空字符串默认)”时,存在向右下的偏差

存在偏差的原因可能是,当align不为“TL”时,程序窗口假定SWF内容的尺寸仍为其初始值(500×375),并按这个尺寸来定位SWF内容的位置,例如,对齐模式选“T”(顶部居中),拖动改变窗口大小为598×484时,窗口内容区域尺寸为590×450,程序窗口仍假定SWF内容尺寸为其初始值500×375,按着个值计算,SWF内容被定位到了窗口内容区域的(45,0)的位置,如下图

wKiom1RSDsfCNNDeAAKbb1i2pFc652.jpg

但实际上SWF尺寸、Application尺寸已经改变为590×450,和窗口内容区域一样大小,所以程序窗口对SWF内容的定位不是我们所期望的值。

因为缩放模式为noScale,所以改变窗口尺寸,SWF的内容无缩放。

3、窗口尺寸、SWF尺寸缺省设置,stage.scaleMode选noScale以外的值,stage.align选择不确定的值

改变窗口尺寸时,stage.stageWidth|stageHeight的值并不改变,仍为初始的默认值(500×375),但Application尺寸却会自动改变填充窗口内容区域。Stage不会调度Event.RESIZE事件。

showAll时,由于与上述类似的原因,在对齐模式选择 T、TR、默认、B、BR、R,SWF内容会有向右的偏移。

noBorder由于会显示全部SWF内容,所以偏移现象不明显。

exactFit由于会拉伸尺寸到整个窗口,所以不会看到偏移,align选择任何值也不会改变SWF内容的位置(因为已经铺满整个窗口了,位置固定为[0,0])

4、窗口尺寸设置为808×634,SWF尺寸默认

Stage、Application初始尺寸自动填满窗口内容区域,尺寸为800×600

scaleMode选noScale时,align选TL以外的值,仍有偏移问题,因为没设置SWF尺寸,所以程序窗口仍把SWF尺寸看成其初始默认值500×375。

scaleMode选其他值,跟选项3的结果类似

未完待续……

本文出自 “博客命名跟变量名一样麻烦” 博客,请务必保留此出处http://cstar.blog.51cto.com/2923639/1569819

Flex 4 stage.scaleMode 详解