设置舞台属性

Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本

Stage 类用于覆盖 DisplayObject 类的大多数属性和方法。如果调用其中一个被覆盖的属性或方法,Flash Player 和 AIR 会引发异常。例如,Stage 对象不具有 xy 属性,因为作为应用程序的主容器,该对象的位置是固定的。xy 属性是指显示对象相对于其容器的位置,因为舞台没有包含在其他显示对象容器中,所以这些属性不适用。

注: Stage 类的某些属性和方法只适用于与加载的第一个 SWF 文件在同一个安全沙箱中的显示对象。有关详细信息,请参阅 Stage 安全性

控制播放帧速率

Stage 类的 frameRate 属性用于设置加载到应用程序中的所有 SWF 文件的帧速率。有关详细信息,请参阅用于 Adobe Flash Platform 的 ActionScript 3.0 参考

控制舞台缩放

当调整呈示 Flash Player 或 AIR 的屏幕部分的大小时,运行时会自动调整舞台内容来加以补偿。Stage 类的 scaleMode 属性可确定如何调整舞台内容。此属性可以设置为 4 个不同值,如 flash.display.StageScaleMode 类中的常量所定义:

  • StageScaleMode.EXACT_FIT 缩放 SWF 以填满新舞台尺寸,而不考虑原来的内容高宽比。宽度和高度的缩放系数可能会有所不同,因此当舞台的高宽比发生更改时,显示的内容有可能随之压扁或拉长。

  • StageScaleMode.SHOW_ALL 会在保持内容高宽比的前提下,缩放 SWF 以适应新舞台。这种缩放模式可完整显示所有内容,但是可能导致出现“邮箱”式边框,就像使用标准电视收看宽屏电影时出现的黑色长条。

  • StageScaleMode.NO_BORDER 会在保持内容高宽比的前提下,缩放 SWF 以填满新舞台。这种缩放模式可以充分利用舞台显示区域,但可能导致裁切。

  • StageScaleMode.NO_SCALE — 不缩放 SWF。 如果新舞台较小,内容将遭到裁切;如果较大,所增加的空间将显示为空白。

    仅在 StageScaleMode.NO_SCALE 缩放模式中,Stage 类的 stageWidth 和 stageHeight 属性才能用于确定窗口调整大小后的实际像素尺寸。(在其他缩放模式中,stageWidthstageHeight 属性始终反映的是 SWF 的原始宽度和高度。)此外,当 scaleMode 设置为 StageScaleMode.NO_SCALE 并且调整了 SWF 文件大小时,将调度 Stage 类的 resize 事件,以允许您进行相应地调整。

    因此,将 scaleMode 设置为 StageScaleMode.NO_SCALE 可以更好地控制如何根据需要调整屏幕内容以适合窗口大小。例如,在包含视频和控制栏的 SWF 中,您可能希望在调整舞台大小时控制栏的大小保持不变,而仅更改视频窗口大小以适应舞台大小的更改。以下示例中演示了这一点:

    // mainContent is a display object containing the main content; 
    // it is positioned at the top-left corner of the Stage, and 
    // it should resize when the SWF resizes. 
     
    // controlBar is a display object (e.g. a Sprite) containing several 
    // buttons; it should stay positioned at the bottom-left corner of the 
    // Stage (below mainContent) and it should not resize when the SWF 
    // resizes. 
     
    import flash.display.Stage; 
    import flash.display.StageAlign; 
    import flash.display.StageScaleMode; 
    import flash.events.Event; 
     
    var swfStage:Stage = mainContent.stage; 
    swfStage.scaleMode = StageScaleMode.NO_SCALE; 
    swfStage.align = StageAlign.TOP_LEFT; 
    swfStage.addEventListener(Event.RESIZE, resizeDisplay); 
     
    function resizeDisplay(event:Event):void 
    { 
        var swfWidth:int = swfStage.stageWidth; 
        var swfHeight:int = swfStage.stageHeight; 
     
        // Resize the main content area 
        var newContentHeight:Number = swfHeight - controlBar.height; 
        mainContent.height = newContentHeight; 
        mainContent.scaleX = mainContent.scaleY; 
         
        // Reposition the control bar. 
        controlBar.y = newContentHeight; 
    }

设置 AIR 窗口的舞台缩放模式

舞台 scaleMode 属性确定在调整窗口大小时舞台如何缩放和剪裁子显示对象。在 AIR 中只应使用 noScale 模式。在此模式中不缩放舞台。舞台的大小直接随窗口的范围变化。如果将窗口调小,则可能会剪裁对象。

舞台缩放模式旨在用于您无法始终控制舞台大小或高宽比的环境,例如 Web 浏览器。当舞台与应用程序的理想大小或高宽比不匹配时,使用这些模式可以选择最好的折衷方案。在 AIR 中,您始终能够控制舞台,因此在大多数情况下,重新放置您的内容或调整窗口尺寸可以获得比启用舞台缩放更好的结果。

在浏览器中,以及对于初始 AIR 窗口,窗口大小与初始缩放系数之间的关系是从所加载的 SWF 文件中读取的。然而,在创建 NativeWindow 对象时,AIR 选择窗口大小和缩放系数 72:1 之间的任意关系。因此如果窗口为 72x72 像素,则以 10x10 像素的正确大小绘制添加到窗口的 10x10 矩形。但是,如果窗口为 144x144 像素,则 10x10 像素的矩形会缩放为 20x20 像素。如果您坚持对窗口舞台使用 scaleMode 而不是 noScale,则可以通过将窗口中的任何显示对象的缩放系数都设置为 72 像素与舞台的当前宽度和高度之比加以补偿。例如,以下代码计算名为 client 的显示对象所需的缩放系数:

if(newWindow.stage.scaleMode != StageScaleMode.NO_SCALE){ 
client.scaleX = 72/newWindow.stage.stageWidth; 
client.scaleY = 72/newWindow.stage.stageHeight; 
}
注: Flex 和 HTML 窗口自动将舞台 scaleMode 设置为 noScale。更改 scaleMode 会打乱这些窗口类型中所使用的自动布局机制。

使用全屏模式

使用全屏模式可以将影片的舞台设置为填充查看者的整个显示器,而不包含任何边框或菜单。Stage 类的 displayState 属性用于切换 SWF 的全屏模式。可以将 displayState 属性设置为由 flash.display.StageDisplayState 类中的常量定义的其中一个值。若要打开全屏模式,请将 displayState 属性设置为 StageDisplayState.FULL_SCREEN

stage.displayState = StageDisplayState.FULL_SCREEN; 

若要启用全屏交互模式(Flash Player 11.3 中的新增功能),请将 displayState 属性设置为 StageDisplayState.FULL_SCREEN_INTERACTIVE

stage.displayState = StageDisplayState.FULL_SCREEN_INTERACTIVE; 

在 Flash Player 中,只能通过 ActionScript 响应鼠标单击(包括右键单击)或按键来启动全屏模式。在应用程序安全沙箱中运行的 AIR 内容不要求在响应用户手势时进入全屏模式。

若要退出全屏模式,请将 displayState 属性设置为 StageDisplayState.NORMAL

stage.displayState = StageDisplayState.NORMAL; 

此外,用户可以通过将焦点切换到其他窗口或使用以下组合键之一退出全屏模式:Esc 键(所有平台)、Ctrl-W (Windows)、Command-W (Mac) 或 Alt-F4 (Windows)。

启用 Flash Player 中的全屏模式

若要为 HTML 页中嵌入的 SWF 文件启用全屏模式,必须在嵌入 Flash Player 的 HTML 代码中加入含有名称 allowFullScreen 和值 trueparam 标签和 embed 属性,如下所示:

<object> 
    ... 
    <param name="allowFullScreen" value="true" /> 
    <embed ... allowFullScreen="true" /> 
</object>

在 Flash 创作工具中选择“文件”->“发布设置”,并在“发布设置”对话框中的“HTML”选项卡上选择“仅 Flash - 允许全屏”模板。

在 Flex 中,确保 HTML 模板包含支持全屏的 <object><embed> 标签。

如果要在网页中使用 JavaScript 来生成 SWF 嵌入标签,则必须更改 JavaScript 以添加 allowFullScreen param 标签和属性。例如,如果 HTML 页使用 AC_FL_RunContent() 函数(在由 Flash Professional 和 Flash Builder 生成的 HTML 页中使用),则应在该函数调用中添加 allowFullScreen 参数,如下所示:

AC_FL_RunContent( 
    ... 
    'allowFullScreen','true', 
    ... 
    ); //end AC code

这不适用于在独立 Flash Player 中运行的 SWF 文件。

注: 如果将窗口模式(HTML 中的 wmode)设置为不透明无窗口 (opaque) 或透明无窗口 (transparent),则全屏窗口始终是不透明的

对浏览器中的 Flash Player 使用全屏模式时还有一些安全方面的限制。安全性中对这些限制进行了说明。

在 Flash Player 11.3 和更高版本中启用全屏交互模式

Flash Player 11.3 和更高版本支持全屏交互模式,该模式可实现对所有键盘键的完全支持(Esc 除外,使用该键将退出全屏交互模式)。全屏交互模式对于游戏非常有用(例如,支持多人游戏聊天或第一人射击游戏中的 WASD 键盘控件。)

若要为 HTML 页中嵌入的 SWF 文件启用全屏交互模式,必须在嵌入 Flash Player 的 HTML 代码中加入含有名称 allowFullScreenInteractive 和值 trueparam 标签和 embed 属性,如下所示:

<object> 
    ... 
    <param name="allowFullScreenInteractive" value="true" /> 
    <embed ... allowFullScreenInteractive="true" /> 
</object>

在 Flash 创作工具中选择“文件”->“发布设置”,并在“发布设置”对话框中的“HTML”选项卡上选择“仅 Flash - 允许全屏”模板。

在 Flash Builder 和 Flex 中,确保 HTML 模板包括支持全屏交互模式的 <object><embed> 标签。

如果要在网页中使用 JavaScript 来生成 SWF 嵌入标签,则必须更改 JavaScript 以添加 allowFullScreenInteractive param 标签和属性。例如,如果 HTML 页使用 AC_FL_RunContent() 函数(在由 Flash Professional 和 Flash Builder 生成的 HTML 页中使用),则应在该函数调用中添加 allowFullScreenInteractive 参数,如下所示:

AC_FL_RunContent( 
    ... 
    'allowFullScreenInteractive','true', 
    ... 
    ); //end AC code

这不适用于在独立 Flash Player 中运行的 SWF 文件。

全屏舞台大小和缩放

Stage.fullScreenHeightStage.fullScreenWidth 属性返回在转为全屏大小时所使用的显示器的高度和宽度(如果是立即进入全屏状态)。在您检索到这些值之后,但在进入全屏模式之前,如果用户有机会将浏览器从一台显示器移至另一台显示器,则这些值可能不正确。如果是在将 Stage.displayState 属性设置为 StageDisplayState.FULL_SCREEN 的同一个事件处理函数中检索这些值,则这些值正确。对于拥有多台显示器的用户,SWF 内容扩大时只会填充一台显示器。Flash Player 和 AIR 使用度量信息来确定哪个显示器包含 SWF 的最大部分内容,然后使用该显示器提供全屏模式。fullScreenHeight 和 fullScreenWidth 属性仅反映出显示器用于全屏模式的大小。有关详细信息,请参阅用于 Adobe Flash Platform 的 ActionScript 3.0 参考中的 Stage.fullScreenHeightStage.fullScreenWidth

全屏模式的舞台缩放行为与正常模式下的相同;缩放比例由 Stage 类的 scaleMode 属性控制。如果 scaleMode 属性设置为 StageScaleMode.NO_SCALE,则舞台的 stageWidthstageHeight 属性会发生更改,以反映 SWF 所占用的屏幕区域的大小(在本例中为整个屏幕);如果在浏览器中查看,则此属性的 HTML 参数用于控制该设置。

打开或关闭全屏模式时,可以使用 Stage 类的 fullScreen 事件来进行检测和响应。例如,进入或退出全屏模式时,您可能需要重新定位、添加或删除屏幕中的项目,如本例中所示:

import flash.events.FullScreenEvent; 
 
function fullScreenRedraw(event:FullScreenEvent):void 
{ 
    if (event.fullScreen) 
    { 
        // Remove input text fields. 
        // Add a button that closes full-screen mode. 
    } 
    else 
    { 
        // Re-add input text fields. 
        // Remove the button that closes full-screen mode. 
    } 
} 
 
mySprite.stage.addEventListener(FullScreenEvent.FULL_SCREEN, fullScreenRedraw);

正如此代码所示,fullScreen 事件的事件对象是 flash.events.FullScreenEvent 类的实例,它包含指示是启用 (true) 还是禁用 (false) 全屏模式的 fullScreen 属性。

全屏模式下的键盘支持

当 Flash Player 在浏览器中运行时,全屏模式下将禁用所有与键盘相关的 ActionScript,如 TextField 实例中的键盘事件和文本输入。但有一些例外(启用的键):

  • 经过挑选的非打印键,尤其是方向键、空格键和 Tab 键

  • 用于终止全屏模式的快捷键:Esc(Windows 和 Mac)、Ctrl-W (Windows)、Command-W (Mac) 和 Alt-F4

对于在独立 Flash Player 或 AIR 中运行的 SWF 内容,不存在这些限制。AIR 支持允许键盘输入的交互式全屏模式。

全屏模式下的鼠标支持

默认情况下,全屏模式下的鼠标事件的工作方式与未处于全屏模式时相同。但是,在全屏模式下,您可以选择设置 Stage.mouseLock 属性,以启用鼠标锁定。鼠标锁定将禁用光标,且启用没有限制的鼠标移动。

注: 您只能在桌面应用程序的全屏模式下启用鼠标锁定。如果在未处于全屏模式的应用程序上或为移动设备上的应用程序设置鼠标锁定,则会引发异常。

在下列情况下鼠标锁定被自动禁用,鼠标光标再次显示:

  • 用户使用 Esc 键(所有平台)、Ctrl-W (Windows)、Command-W (Mac) 或 Alt-F4 (Windows) 退出全屏模式。

  • 应用程序窗口丢失焦点。

  • 任何设置 UI 都可见,包括所有隐私对话框。

  • 显示本机对话框,如文件上传对话框。

与鼠标移动相关的事件,例如 mouseMove 事件,使用 MouseEvent 类表示事件对象。禁用鼠标锁定时,使用 MouseEvent.localXMouseEvent.localY 属性确定鼠标的位置。启用鼠标锁定时,使用 MouseEvent.movementXMouseEvent.movementY 属性确定鼠标的位置。movementXmovementY 属性包含自上一个事件以来的鼠标位置的变化,而不是鼠标位置的绝对坐标。

全屏模式下的硬件缩放

使用 Stage 类的 fullScreenSourceRect 属性可以设置 Flash Player 或 AIR 以将舞台的特定区域放大为全屏幕模式。Flash Player 和 AIR 使用用户计算机上的图形和视频卡进行硬件缩放(如果可用),一般来说显示内容的速度要快于软件缩放。

若要利用硬件缩放功能,请将整个舞台或部分舞台设置为全屏模式。 以下 ActionScript 3.0 代码将整个舞台设置为全屏模式:

import flash.geom.*;  
{ 
    stage.fullScreenSourceRect = new Rectangle(0,0,320,240); 
    stage.displayState = StageDisplayState.FULL_SCREEN; 
}

如果将此属性设置为有效矩形并将 displayState 属性设置为全屏模式,Flash Player 和 AIR 对指定区域进行缩放。ActionScript 中的实际舞台大小(以像素为单位)不会发生改变。 Flash Player 和 AIR 对矩形大小强制规定了最小限制,以容纳标准的“按 Esc 退出全屏模式”消息。通常,此限制大约为 260 x 30 个像素,但可能因平台和 Flash Player 版本而异。

仅当 Flash Player 或 AIR 处于非全屏模式时,才能设置 fullScreenSourceRect 属性。若要正确使用此属性,请先设置此属性,然后再将 displayState 属性设置为全屏模式。

若要启用缩放功能,请将 fullScreenSourceRect 属性设置为矩形对象。

stage.fullScreenSourceRect = new Rectangle(0,0,320,240);

若要禁用缩放功能,请将 fullScreenSourceRect 属性设置为 null

stage.fullScreenSourceRect = null;

若要利用 Flash Player 中的所有硬件加速功能,请通过 Flash Player 的“设置”对话框将其启用。若要加载该对话框,请在浏览器的 Flash Player 内容中单击右键 (Windows) 或按住 Control 的同时单击 (Mac)。选择“显示”选项卡(第一个选项卡),然后选中复选框:“启用硬件加速”。

直接窗口模式和 GPU 合成窗口模式

Flash Player 10 引入了两种窗口模式:直接模式和 GPU 合成模式。可以通过 Flash 创作工具中的发布设置启用这些模式。AIR 中不支持这两种模式。若要利用这两种模式,必须为 Flash Player 启用硬件加速。

直接模式使用最快、最直接的路径将图形推送至屏幕,这有利于视频播放。

GPU 合成模式使用显卡中的图形处理单元来加速合成。视频合成是层叠多幅图像以创建单幅视频图像的过程。当采用 GPU 加速合成时,这可提高 YUV 转换、颜色校正、旋转或缩放以及混合的性能。YUV 转换是指将用于传输的合成模拟信号转换为视频摄像头和显示器所使用的 RGB(红、绿、蓝)颜色模型的颜色转换。使用 GPU 加速合成可减少内存占用量以及 CPU 的计算负担。这还促成了标准清晰度视频更平滑的播放。

在实施这些窗口模式时应谨慎小心。使用 GPU 合成可能消耗很多内存资源和 CPU 资源。如果某些操作(如混合模式、过滤、剪裁或遮罩)无法在 GPU 中执行,则可以通过软件来完成。Adobe 建议在使用这些模式时,应限制为每个 HTML 页面一个 SWF 文件,并且不应对横幅启用这些模式。Flash“测试影片”工具不使用硬件加速,但是可通过“发布预览”选项来使用硬件加速。

将 SWF 文件中的帧速率设置为高于 60(最大屏幕刷新率)将不起作用。将帧速率设置为 50 到 55 之间将允许放弃的帧,这种情况经常由于各种原因而发生。

使用直接模式对于 Windows 需要 Microsoft DirectX 9 以及 128 MB VRAM,对于 Apple Macintosh Mac OS X 10.2 版或更高版本需要 OpenGL。GPU 合成模式需要在具有 128 MB VRAM 的 Windows 上支持 Microsoft DirectX 9 和 Pixel Shader 2.0。在 Mac OS X 和 Linux 上,GPU 合成模式需要 OpenGL 1.5 以及多种 OpenGL 扩展(帧缓冲区对象、多纹理、着色器对象、着色语言和片段着色器)。

可通过 Flash“发布设置”对话框,使用“Flash”选项卡上的“硬件加速”菜单,为每个 SWF 单独激活 directgpu 加速模式。如果选择“无”,则窗口模式将按照“HTML”选项卡上“窗口模式”设置所指定的项,转换为 defaulttransparentopaque