桌面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尺寸自动填满窗口内部区域(即窗口尺寸减去窗口镶边和标题栏后的尺寸,标题栏30px + 窗口底边4px =34px,左边+右边=8px)为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)的位置,如下图
但实际上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尺寸设置为固定值(如400×300)
Stage、Application初始尺寸自动填满窗口内容区域,尺寸为800×600
SWF尺寸为设置的值400×300(如不设置SWF尺寸,就是默认尺寸500×375)
scaleMode选noScale时,align选TL以外的值,仍有偏移问题,程序窗口仍把SWF尺寸看成其初始设置的尺寸值400×300。
scaleMode选showAll或noBorder或exactFit时,程序窗口会把SWF尺寸视为初始设置的值(尽管这里Application尺寸已经是800×600,但程序窗口仍把SWF内容尺寸视为初始设置的400×300),并用该尺寸来整体缩放SWF内容,故这里就会造成虽然选了showAll、exactFit,但并不能显示SWF所有内容的问题,因为程序窗口把SWF看成只有400×300大小,而并不是Application的尺寸800×600。而选noBorder时,显示的内容范围就更少。scaleMode选择showAll或noBorder时,align改变值效果跟 第3段 所述类似。scaleMode选择exactFit,则align的值,不会影响SWF内容的位置,因为SWF(按初始值的400×300尺寸内容)铺满窗口,位置固定为[0,0]。
改变窗口尺寸时,如果scaleMode不是noScale,则不会调度Event.RESIZE事件,Stage尺寸也不会改变(仍为初始值800×600),但Application的尺寸一直都会改变填满窗口内容区域尺寸
5、窗口尺寸设置为固定值(如408×334),SWF尺寸设置为比窗口尺寸大的固定值(如500×400)
noScale+TL设置下,窗口无法显示SWF的全部内容,因为SWF尺寸的初始设置值大于窗口值,改变窗口大小时,调度Event.RESIZE事件。Stage尺寸,Application尺寸自动填满窗口内容区域。
noScale+T|TR…其他对齐模式时,程序窗口把SWF尺寸视为其初始设置值(500×400)来确定SWF内容的位置,所以noScale+T,SWF内容会向左偏移,放置于[-50,0],但由于窗口内容区域、Application实际尺寸是400×300,所以窗口右边出现50px的空白背景色区域,noScale+TR时,是100px空白区域
缩放模式选择noScale以外的值。会把SWF尺寸视为初始尺寸设置值来缩放和对齐,但Application尺寸一直都会填满整个窗口可视区域。
总结:
Flex 4 桌面项目的程序窗口总会把SWF内容的尺寸视为SWF中Metadata设置的值(不变),但Application的尺寸会无视对齐和缩放模式选项自动填满窗口内容区域。所以造成Flex 4桌面项目的对齐位置和缩放比例与预期值不符
转载于:https://blog.51cto.com/cstar/1569819