WindowState

重要

本文說明 處於公開預覽 狀態的功能和指引,而且可能會在正式推出之前大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。

WindowState 是 Jetpack Compose 的公用程式程式庫,可協助您輕鬆取得雙螢幕、可折迭和大型螢幕裝置視窗狀態的詳細資料。 此資訊是使用 Google 的 Jetpack 視窗管理員 程式庫所收集。

類別 WindowState 會以 Compose 狀態提供資訊,其中包含折迭功能位置/方向、視窗大小類別和視窗模式等屬性。 高度和寬度視窗大小類別是根據 官方 Android 指導方針來測量,而目前的視窗模式取決於折迭功能和裝置方向。 提醒您,視窗模式是顯示利用雙螢幕和可折迭尺寸的狀態。 有四種可能模式:雙直向、雙重橫向、單一直向和單一橫向。

四個視窗模式/顯示狀態的圖形

新增相依性

  1. 請確定您在最上層build.gradle檔案中有mavenCentral () 存放庫:

    allprojects {
        repositories {
            google()
            mavenCentral()
         }
    }
    
  2. 將下列相依性新增至模組層級 build.gradle 檔案, (目前版本可能與此處所示的內容不同) :

    implementation "com.microsoft.device.dualscreen:windowstate:1.0.0-alpha07"
    
  3. 此外,請確定 compileSdkVersion 已設定為 API 33,且 targetSdkVersion 設定為模組層級 build.gradle 檔案中的 API 32 或更新版本。

    android { 
        compileSdkVersion 33
    
        defaultConfig { 
            targetSdkVersion 32
        } 
        ... 
    }
    

在您的專案中使用 WindowState

若要在 Compose 專案中使用程式庫,請從 MainActivity 呼叫 函 rememberWindowState() 式。 這個方法會傳 WindowState 回物件,您可以傳遞至最上層可撰寫的狀態。

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        setContent {
            ExampleAppTheme {
                ExampleApp(rememberWindowState())
            }
        }
    }
}

接著,您可以在撰寫程式記憶體取物件的不同屬性 WindowState ,以選擇應用程式的版面配置。 在下列範例中 isDualScreen() ,方法可用來選擇兩個不同的版面配置,一個用於單一螢幕裝置,另一個用於雙螢幕裝置。

fun ExampleApp(windowState: WindowState) {
    if (windowState.isDualScreen())
        DualScreenAppContent(windowState.foldSizeDp)
    else
        SingleScreenAppContent()
}

如需更詳細的 API 參考資訊,請參閱 WindowState 讀我檔案

計算窗格大小

除了公開 Jetpack 視窗管理員和視窗大小類別資訊之外,類別 WindowState 也會計算兩個窗格版面配置的窗格大小。 如果 TwoPaneLayout 元件不適合您的專案,您可以使用 largeScreenPane1Weightpane1SizeDppane2SizeDp 屬性來設定您自己的自訂版面配置:

fun ExampleApp(windowState: WindowState) {
    windowState.largeScreenPane1Weight = 0.3f
    
    CustomListDetailLayout(
        pane1Width = windowState.pane1SizeDp.width,
        pane2Width = windowState.pane2SizeDp.width,
        list = { ListContent() },
        detail = { DetailContent() }
    )
}

窗格大小是根據下列邏輯來計算:

  • 如果視窗包含 分隔 折迭功能:
    • 根據折迭功能的界限計算窗格大小
  • 如果視窗被視為大型 (EXPANDED 寬度,且至少 MEDIUM 高度大小類別) :
    • 根據 largeScreenPane1Weight 屬性、視窗大小和裝置方向計算窗格大小
  • 如果無法折迭或大型螢幕:
    • 應該只顯示一個窗格,因此傳回窗格大小 0

請注意,這些邏輯檢查會依序執行,因此如果大型可折迭裝置並未分隔其折迭功能,表示裝置沒有轉軸且為平移,就可能被視為大型螢幕。

重要

largeScreenPane1Weight必須在呼叫 pane1SizeDppane2SizeDp之前設定 屬性,才能在計算中使用權數。

我們建議使用上述屬性來同時支援大型螢幕和可折迭。 不過,如果您只需要在分隔折迭功能出現時使用窗格大小,則可以改用 foldablePane1SizeDpfoldablePane2SizeDp 屬性:

fun ExampleApp(windowState: WindowState) {
    CustomCompanionPaneLayout(
        pane1Size = windowState.foldablePane1SizeDp,
        pane2Size = windowState.foldablePane2SizeDp,
        game = { GameScreen() },
        controls = { ControlPanel() }
    )
}

範例

若要查看更多如何使用 WindowState 的範例,請參閱連結 庫範例 和我們的 Compose 範例