產品新訊

Android 裝置可順暢地延伸到連接的螢幕

閱讀時間:7 分鐘
Francesco Romano
Android 開發人員關係工程師

我們很高興宣布,Android 裝置與電腦的整合邁向重大里程碑:連線螢幕支援功能已在 Android 16 QPR3 版本中正式推出!

2025 年 Google I/O 大會所示,連線螢幕可讓使用者將 Android 裝置連線至外接螢幕,並立即存取電腦視窗環境。使用者可以在任意形式或最大化的視窗中使用應用程式,並像在電腦作業系統上一樣執行多工。

Google 和 Samsung 攜手合作,為 Android 生態系統中搭載 Android 16 的裝置提供順暢且強大的電腦分割視窗體驗,只要將裝置連上外接螢幕即可使用。
現在,使用者只要將支援的 Pixel 和 Samsung 手機連接至外接螢幕,就能在支援的裝置* 上使用這項功能,進而打造更具吸引力且更有效率的應用程式體驗,並適應各種外型規格。

運作方式

將支援的 Android 手機或摺疊式裝置連上外接螢幕時,外接螢幕會啟動新的電腦工作階段。

連線螢幕上的體驗與桌機類似,包括顯示使用中應用程式的工作列,以及可供使用者釘選應用程式以便快速存取。使用者可以在連接的螢幕上,以可自由調整大小的視窗並排執行多個應用程式。

materialDisplay.gif

手機連上外接螢幕,螢幕上顯示電腦工作階段,手機則維持自身狀態。

將支援電腦分割視窗模式的裝置 (例如 Samsung Galaxy Tab S11 等平板電腦) 連接至外接螢幕時,電腦工作階段會延伸至兩個螢幕,解鎖更寬廣的工作區。這時兩個螢幕會做為一個連續系統運作,讓應用程式視窗、內容和游標在螢幕間自由移動。

materialDisplay2.gif

平板電腦已連上外接螢幕,並將電腦版工作階段擴展到兩個螢幕。

又對使用者有哪些幫助?

在 Android 16 QPR3 版本中,我們最終確定了視窗行為、工作列互動和輸入相容性 (滑鼠和鍵盤),這些定義了連線螢幕體驗。我們也加入了相容性處理方式,可在切換螢幕時縮放視窗,避免應用程式重新啟動。


如果應用程式是採用自適應設計原則建構,就會自動呈現電腦版的外觀和風格,讓使用者感到熟悉。如果應用程式鎖定為直向模式,或假設介面僅供觸控操作,現在就是進行現代化的好時機。

請特別注意下列主要最佳做法,在連網螢幕上提供最佳應用程式體驗:

  • 請勿假設 Display 物件保持不變:當應用程式視窗移至外部螢幕,或顯示器設定變更時,與應用程式內容相關聯的 Display 物件可能會變更。應用程式應妥善處理設定變更事件,並動態查詢螢幕指標,而非快取這些指標。
  • 考量密度設定變更外部螢幕的像素密度可能與主要裝置螢幕大不相同。請確保版面配置和資源能正確適應這些變更,維持 UI 清晰度和可用性。請使用密度獨立像素 (dp) 設定版面配置、提供特定密度的資源,並確保 UI 能適當縮放。
  • 正確支援外部週邊裝置:使用者連接外接螢幕時,通常會建立類似桌面的環境,因此經常使用外接鍵盤、滑鼠、觸控板、網路攝影機、麥克風和喇叭。請改善對鍵盤滑鼠互動的支援。

運用現代化工具,打造未來桌面應用程式

我們提供多種工具,協助您建構電腦版體驗。現在就來回顧核心自適應程式庫的最新更新!

全新視窗大小類別:大型和特大型

Jetpack WindowManager 1.5.0 的最大更新,是新增了兩種寬度視窗大小類別:「大型」和「特大型」。

視窗大小類別是我們官方認可的一組可視區域中斷點,可協助您設計及開發自動調整式版面配置。在 1.5.0 版中,我們將這項指引擴展至超出一般平板電腦大小的螢幕。

以下是新的寬度斷點:

  • 大型:適用於寬度介於 1200dp 和 1600dp 之間的螢幕
  • 特大:適用於寬度 ≥1600dp
windowClasses.png

根據螢幕寬度劃分的不同視窗大小類別。

在超大螢幕上,單純放大平板電腦的「展開」版面配置,不一定能提供最佳使用者體驗。舉例來說,電子郵件用戶端可能會在「展開」視窗大小類別中,舒適地顯示兩個窗格 (信箱和郵件)。但在特大桌上型螢幕上,電子郵件用戶端可以同時顯示三個甚至四個窗格,例如信箱、郵件清單、完整郵件內容和日曆/工作窗格。

如要在專案中加入新的視窗大小類別,只要從 WindowSizeClass.BREAKPOINTS_V2 集合呼叫函式,而非 WindowSizeClass.BREAKPOINTS_V1

val currentWindowMetrics =
    WindowMetricsCalculator.getOrCreate()
    .computeCurrentWindowMetrics(LocalContext.current)

val sizeClass = WindowSizeClass.BREAKPOINTS_V2
    .computeWindowSizeClass(currentWindowMetrics)

確認應用程式至少有這麼多空間後,再套用正確的版面配置:

if(sizeClass.isWidthAtLeastBreakpoint(
    WindowSizeClass.WIDTH_DP_LARGE_LOWER_BOUND)){
    ...
	// Window is at least 1200 dp wide.
}

使用 Jetpack Navigation 3 建構自動調整式版面配置

Navigation 3 是 Jetpack 系列的最新成員。Navigation 3 剛推出第一個穩定版,是專為 Compose 設計的強大導覽程式庫。

Navigation 3 也是建構自適應版面的絕佳工具,可同時顯示多個目的地,並在這些版面之間順暢切換。

這個應用程式 UI 流程管理系統是以「場景」為基礎。場景是同時顯示一或多個目的地的版面配置。SceneStrategy 會判斷是否可以建立場景。將 SceneStrategy 執行個體串連在一起,即可為不同螢幕尺寸和裝置設定建立及顯示不同場景。

如要使用清單詳細資料和支援窗格等現成標準版面配置,可以使用 Compose Material 3 自適應程式庫中的場景 (適用於1.3 以上版本)。

您也可以修改場景配方或從頭開始,輕鬆建構自己的自訂場景。舉例來說,假設有一個場景會並排顯示三個窗格:

class ThreePaneScene<T : Any>(
    override val key: Any,
    override val previousEntries: List<NavEntry<T>>,
    val firstEntry: NavEntry<T>,
    val secondEntry: NavEntry<T>,
    val thirdEntry: NavEntry<T>
) : Scene<T> {
    override val entries: List<NavEntry<T>> = listOf(firstEntry, secondEntry, thirdEntry)
    override val content: @Composable (() -> Unit) = {
        Row(modifier = Modifier.fillMaxSize()) {
            Column(modifier = Modifier.weight(1f)) {
                firstEntry.Content()
            }
            Column(modifier = Modifier.weight(1f)) {
                secondEntry.Content()
            }
            Column(modifier = Modifier.weight(1f)) {
                thirdEntry.Content()
            }
        }
    }

在這種情況下,如果視窗寬度足夠,且返回堆疊中的項目已聲明支援在三窗格場景中顯示,您就可以定義 SceneStrategy 來顯示三個窗格。

class ThreePaneSceneStrategy<T : Any>(val windowSizeClass: WindowSizeClass) : SceneStrategy<T> {
    override fun SceneStrategyScope<T>.calculateScene(entries: List<NavEntry<T>>): Scene<T>? {
        if (windowSizeClass.isWidthAtLeastBreakpoint(WIDTH_DP_LARGE_LOWER_BOUND)) {
            val lastThree = entries.takeLast(3)
            if (lastThree.size == 3 && lastThree.all { it.metadata.containsKey(MULTI_PANE_KEY) }) {
                val firstEntry = lastThree[0]
                val secondEntry = lastThree[1]
                val thirdEntry = lastThree[2]


                return ThreePaneScene(
                    key = Triple(firstEntry.contentKey, secondEntry.contentKey, thirdEntry.contentKey),
                    previousEntries = entries.dropLast(3),
                    firstEntry = firstEntry,
                    secondEntry = secondEntry,
                    thirdEntry = thirdEntry
                )
            }
        }
        return null
    }
}

建立 NavDisplay 時,您可以將 ThreePaneSceneStrategy 與其他策略搭配使用。舉例來說,如果空間不足以顯示三個窗格,我們也可以新增 TwoPaneStrategy,並排顯示兩個窗格。

val strategy = ThreePaneSceneStrategy() then TwoPaneSceneStrategy()

NavDisplay(..., 
  sceneStrategy = strategy,
  entryProvider = entryProvider { 
    entry<MyScreen>(metadata = mapOf(MULTI_PANE_KEY to true))) { ... }
    ... other entries...
  }
)

如果沒有足夠空間顯示三個或兩個窗格,自訂場景策略都會傳回 null。在本例中,NavDisplay 會改用 SinglePaneScene,在單一窗格中顯示返回堆疊中的最後一個項目。

使用場景和策略,即可在應用程式中新增單格、雙格和三格版面配置!

adaptivepane.gif

自動調整式應用程式在寬螢幕上顯示三窗格導覽。

請參閱說明文件,進一步瞭解如何使用 Navigation 3 中的場景建立自訂版面配置

獨立自動調整式版面配置

如需獨立版面配置,請使用 Compose Material 3 自動調整式程式庫,建立自動調整式 UI,例如清單詳細資料和支援窗格版面配置,這些版面配置會根據視窗大小類別或裝置姿勢,自動調整視窗設定。

好消息是,程式庫已根據新的中斷點更新!從 1.2 版開始,預設窗格架構指令函式支援「大型」和「特大型」寬度視窗大小類別。

您只需要在 Gradle 建構檔案中聲明要使用新的中斷點,即可選擇加入:

currentWindowAdaptiveInfo(supportLargeAndXLargeWidth = true)

開始使用

探索最新 Android 版本中的連線螢幕功能。在支援的裝置上取得 Android 16 QPR3,然後連線至外接螢幕,立即開始測試應用程式!

如要進一步瞭解如何導入這些最佳做法,請參閱多螢幕支援視窗管理的更新版說明文件。

意見回饋

我們會持續改良連結螢幕的電腦版體驗,歡迎提供寶貴意見。歡迎透過官方意見回饋管道分享想法和回報問題。

我們致力於讓 Android 成為多功能平台,可配合使用者與應用程式和裝置互動的各種方式。我們相信,改善連線螢幕支援功能是朝這個方向邁出的重要一步,使用者一定會喜歡您打造的電腦體驗!


*注意:撰寫本文時,Pixel 8、9、10 系列和多款 Samsung 裝置 (包括 S26、Fold7、Flip7 和 Tab S11) 均支援連線螢幕。

撰寫者:

繼續閱讀