從手機擴充到不同的大螢幕板型規格,遊戲處理視窗管理方式時需考量的事項。在 ChromeOS 和 Google Play 遊戲電腦版上,遊戲可以透過主桌面介面以視窗模式執行。搭載 Android 12L (API 級別 32) 以上版本,且螢幕寬度為 > 的新 Android 平板電腦和摺疊式裝置在分割畫面模式中,遊戲可在分割畫面模式中並排執行、調整其他應用程式的大小,甚至還能在摺疊式裝置的內外螢幕之間移動,進而導致視窗大小及某些裝置方向的設定變更。
基本的大螢幕設定
宣告遊戲是否能處理大小調整問題:
<android:resizeableActivity="true" or "false" />
如果無法支援調整大小,請確保遊戲資訊清單明確定義支援的最小和最大顯示比例:
<!-- Render full screen between 3:2 and 21:9 aspect ratio -->
<!-- Let the platform letterbox otherwise -->
<activity android:minAspectRatio="1.5">
<activity android:maxAspectRatio="2.33">
Google Play 遊戲電腦版
對於 Google Play 遊戲電腦版,平台會處理視窗大小調整作業,並遵守指定的顯示比例。視窗大小會自動鎖定為最佳尺寸。如果主要螢幕方向為橫向,或者遊戲採用直向模式,您至少須支援 16:9 的顯示比例。如要獲得最佳體驗,請為橫向遊戲明確支援 21:9、16:10 和 3:2 的顯示比例。此處不必調整視窗大小,但仍建議與其他板型規格相容。
如需詳細資訊和最佳做法,請參閱「設定 Google Play 遊戲電腦版的圖像」。
ChromeOS 和 Android 大螢幕
如要在 ChromeOS 和大螢幕 Android 裝置上將遊戲的可視區域最大化,支援全螢幕沉浸模式,並藉由設定 decorView
標記、系統 UI 顯示設定或 WindowInsetsCompat
API 隱藏系統資訊列。建議您妥善處理旋轉和調整設定事件大小,或避免在 ChromeOS 裝置上發生這些事件。
請注意,在大螢幕 Android 裝置上,遊戲可能會以您可能尚無法處理的設定執行。如果遊戲不支援所有視窗大小和方向設定,平台會在相容模式下為遊戲加上黑邊,並視需要顯示提示,再變更遊戲不支援的設定。
![](https://developer.android.com/static/images/games/multiplatform/configuration_compatibility_dialog.png?authuser=0000&hl=zh-tw)
在某些裝置上,當玩家改用不支援的設定時,系統可能會提示玩家選擇重新載入遊戲,並根據新的視窗版面配置重新建立活動,從而中斷遊戲體驗。以各種多視窗模式設定 (2/3、1/2、1/3 視窗大小) 測試您的遊戲,並確認沒有遭到截斷或無法存取的遊戲元素或 UI 元素。此外,在折疊式裝置的內外螢幕切換時,測試遊戲如何回應折疊式裝置的連續性。如果遇到問題,請明確處理這些設定事件,並加入進階大螢幕大小調整支援功能。
進階大螢幕大小調整功能
如要退出相容性模式並避免活動重建,請按照下列步驟操作:
將主要活動宣告為可調整大小:
<android:resizeableActivity="true" />
宣告明確支援「orientation」、「screenSize」、「smallestScreenSize」、「screenLayout」和「密度」在遊戲資訊清單
<activity>
元素的android:configChanges
屬性中,接收所有大螢幕設定事件:<android:configChanges="screenSize | smallestScreenSize | screenLayout | orientation | keyboard | keyboardHidden | density" />
覆寫
onConfigurationChanged()
並處理設定事件,包括目前的螢幕方向、視窗大小、寬度和高度:Kotlin
override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) val density: Float = resources.displayMetrics.density val newScreenWidthPixels = (newConfig.screenWidthDp * density).toInt() val newScreenHeightPixels = (newConfig.screenHeightDp * density).toInt() // Configuration.ORIENTATION_PORTRAIT or ORIENTATION_LANDSCAPE val newScreenOrientation: Int = newConfig.orientation // ROTATION_0, ROTATION_90, ROTATION_180, or ROTATION_270 val newScreenRotation: Int = windowManager.defaultDisplay.rotation }
Java
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); float density = getResources().getDisplayMetrics().density; int newScreenWidthPixels = (int) (newConfig.screenWidthDp * density); int newScreenHeightPixels = (int) (newConfig.screenHeightDp * density); // Configuration.ORIENTATION_PORTRAIT or ORIENTATION_LANDSCAPE int newScreenOrientation = newConfig.orientation; // ROTATION_0, ROTATION_90, ROTATION_180, or ROTATION_270 int newScreenRotation = getWindowManager().getDefaultDisplay() .getRotation(); }
您也可以查詢 WindowManager
,查看目前的裝置旋轉情形。運用這項中繼資料檢查新視窗尺寸,並算繪成整個視窗大小。由於顯示比例差異,這可能不適用於所有情況,因此,您也可以將遊戲 UI 錨定在新視窗大小,並加上黑邊,核心遊戲內容。如果技術或設計限制妨礙上述任一方法,請在引擎中自行加上黑邊以維持長寬比,並在宣告 resizeableActivity = false
並避免設定模式時,盡可能縮放至最合適的尺寸。
無論您採用何種方法,請在各種設定 (折疊和展開、不同的旋轉變更、分割畫面模式) 中測試遊戲,並確認遊戲內 UI 元素沒有遭到截斷或重疊、觸控目標無障礙功能的問題,或顯示比例問題,導致遊戲畫面拉長、擠壓或變形。
此外,螢幕越大,像素越大,像素越大,區域越大。這可能會導致縮小的轉譯緩衝區或解析度較低的資產像素化。請在大螢幕裝置上使用最高品質的資產,並建立遊戲效能設定檔,確保沒有任何問題。如果遊戲支援多種品質等級,請確保遊戲適用於大螢幕裝置。
多視窗模式
多視窗模式可讓多個應用程式同時分享同一個畫面。多視窗模式不會改變活動生命週期;不過,在不同版本的 Android 上,多個視窗中應用程式的重新啟用狀態會有所不同 (請參閱「支援多視窗模式」中的「多視窗模式的活動生命週期」)。
當玩家將應用程式或遊戲設為多視窗模式時,系統會根據「進階大螢幕大小調整功能」一節中指定的設定變更活動通知活動。此外,當玩家調整遊戲大小或讓遊戲進入全螢幕模式,也會發生設定變更。
應用程式進入多視窗模式時,不保證會重新取得焦點。因此,如果您使用任何應用程式狀態事件暫停遊戲,請勿使用獲取焦點事件 (onWindowFocusChanged()
並將焦點值設為 true) 繼續執行遊戲。請改用其他事件處理常式或狀態變更處理常式,例如 onConfigurationChanged()
或 onResume()
。請注意,您隨時可以使用 isInMultiWindowMode()
方法,偵測目前的活動是否在多視窗模式下執行。
使用 ChromeOS 的多視窗模式,初始視窗尺寸是相當重要的考量因素。遊戲不需要全螢幕,而您必須宣告此情況的視窗大小。以下提供兩種建議做法。
第一個選項是在 Android 資訊清單的 <layout>
標記上使用特定屬性。defaultHeight
和 defaultWidth
屬性可控制初始尺寸。請留意 minHeight
和 minWidth
屬性,避免玩家將遊戲視窗調整成您不支援的維度。最後,gravity
屬性會決定視窗啟動時,畫面上的顯示位置。以下是使用這些屬性的版面配置標記範例:
<layout android:defaultHeight="500dp"
android:defaultWidth="600dp"
android:gravity="top|end"
android:minHeight="450dp"
android:minWidth="300dp" />
設定視窗大小的第二個選項是透過動態啟動邊界進行。您可以使用 setLaunchBounds(Rect)
定義起始視窗維度。如果指定空白矩形,活動會以最大化狀態啟動。
此外,如果您使用 Unity 或 Unreal 遊戲引擎,請務必使用最新版本 (Unity 2019.4.40 和 Unreal 5.3 以上版本),能夠提供良好的多視窗模式支援。
支援摺疊式裝置型態
使用 Jetpack WindowManager 版面配置程式庫支援摺疊式裝置型態 (例如桌面模式),提升玩家的沉浸式體驗和參與度:
![](https://developer.android.com/static/images/games/multiplatform/foldable_posture_support.png?authuser=0000&hl=zh-tw)
Kotlin
fun isTableTopPosture(foldFeature : FoldingFeature?) : Boolean { contract { returns(true) implies (foldFeature != null) } return foldFeature?.state == FoldingFeature.State.HALF_OPENED && foldFeature.orientation == FoldingFeature.Orientation.HORIZONTAL }
Java
boolean isTableTopPosture(FoldingFeature foldFeature) { return (foldFeature != null) && (foldFeature.getState() == FoldingFeature.State.HALF_OPENED) && (foldFeature.getOrientation() == FoldingFeature.Orientation.HORIZONTAL); }