設定 Stage 的屬性

Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本

Stage 類別會覆寫 DisplayObject 類別的大部分屬性和方法。若您呼叫其中一個被覆寫的屬性或方法,Flash Player 和 AIR 都會擲回例外。例如,Stage 物件並沒有 xy 屬性,因為它的位置是固定為應用程式的主要容器。xy 屬性是指顯示物件相對於其容器的位置,而由於 Stage 不包含於其它顯示物件容器之中,所以這些屬性不適用。

備註: 只有與第一個載入的 SWF 檔不在相同安全執行程序中的顯示物件,才能使用 Stage 類別的一些屬性和方法。如需詳細資訊,請參閱Stage 安全性

控制播放影格速率

Stage 類別的 frameRate 屬性可設定載入應用程式中所有 SWF 檔的影格速率。如需詳細資訊,請參閱適用於 Adobe Flash Platform 的 ActionScript 3.0 參考

控制舞台縮放

調整呈現 Flash Player 或 AIR 畫面部分的大小時,執行階段會自動調整「舞台」內容以進行補償。Stage 類別的 scaleMode 屬性會決定「舞台」內容的調整方式。此屬性可以設定成四種不同的值,這些值在 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 中,您可能會想讓控制列在調整「舞台」大小時保持同樣的大小,而只要變更視訊的大小來配合「舞台」大小的改變。這會在下列範例中示範:

    // videoScreen is a display object (e.g. a Video instance) containing a 
    // video; 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 videoScreen) 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 = videoScreen.stage; 
    swfStage.scaleMode = StageScaleMode.NO_SCALE; 
    swfStage.align = StageAlign.TOP_LEFT; 
     
    function resizeDisplay(event:Event):void 
    { 
        var swfWidth:int = swfStage.stageWidth; 
        var swfHeight:int = swfStage.stageHeight; 
     
        // Resize the video window. 
        var newVideoHeight:Number = swfHeight - controlBar.height; 
        videoScreen.height = newVideoHeight; 
        videoScreen.scaleX = videoScreen.scaleY; 
         
        // Reposition the control bar. 
        controlBar.y = newVideoHeight; 
    } 
     
    swfStage.addEventListener(Event.RESIZE, resizeDisplay);

設定 AIR 視窗的舞台縮放模式

舞台 scaleMode 屬性會決定調整視窗大小後,舞台縮放和剪輯子顯示物件的方式。AIR 應該只使用 noScale 模式。 在這個模式下,舞台不會縮放。反而,舞台的大小會隨著視窗的邊緣而直接變更。 若視窗變小,可能會剪輯物件。

舞台縮放模式是針對網路瀏覽器之類的環境所設計,因為在這種環境中您有時無法控制舞台的大小或比例。當舞台不符合應用程式的真實大小或者長寬比,這些模式可以讓您選擇最接近需要的大小或比例。在 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 中,全螢幕模式只能透過 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 程式碼必須包括 param 標籤以及名稱為 allowFullScreen 和值為 trueembed 特質,如下所示:

<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 若要使用全螢幕模式,也有與安全性相關的限制。這些限制會在 安全性中說明。

全螢幕舞台大小與縮放

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,Stage 的 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 類別的實體,其中包含 fullScreen 屬性,指出已啟用全螢幕模式 (true) 或未啟用 (false)。

全螢幕模式中的鍵盤支援

當 Flash Player 在瀏覽器中執行時,所有與鍵盤相關的 ActionScript (如鍵盤事件和 TextField 實體中的輸入文字),在全螢幕模式下都會遭到停用,例外情況 (啟用的按鍵) 如下:

  • 一些非列印按鈕,也就是方向鍵、空格鍵和 Tab 鍵

  • 終止全螢幕模式的鍵盤快速鍵是:Esc (Windows 和 Mac)、Control+W (Windows)、Command+W (Mac) 以及 Alt+F4

這些限制「不適用」於在獨立 Flash Player 或 AIR 中執行的 SWF 內容。AIR 支援互動式全螢幕模式,允許鍵盤輸入。

全螢幕模式中的硬體縮放

在 Flash Player 或 AIR 中,您可以使用 Stage 類別的 fullScreenSourceRect 屬性,將舞台的特定區域設定縮放為全螢幕模式。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 之間的值可以容許丟棄影格的情形,這種情形有時會因為各種原因而發生。

若要使用直接模式,電腦必須配備 Microsoft DirectX 9 和 VRAM 128 MB (Windows) 以及 OpenGL (Apple Macintosh、Mac OS X v10.2 或更新版本)。若要使用 GPU 複合模式,電腦必須具備 Microsoft DirectX 9 和 Pixel Shader 2.0 支援 (Windows) 以及 VRAM 128 MB。對於 Mac OS X 和 Linux 而言,若要使用 GPU 複合模式,則必須具備 OpenGL 1.5 和數個 OpenGL 擴充功能 (framebuffer 物件、多重紋理、著色器物件、陰影語言、片段著色器)。

您可以透過「Flash 發佈設定」對話方塊,利用「Flash」索引標籤上的「硬體加速」選單,為每個 SWF 檔啟動 directgpu 加速模式。如果您選擇「無」,則如「HTML」索引標籤上的「視窗模式」設定所指定,視窗模式會回復至 defaulttransparentopaque