產品新訊

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

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

我們很高興宣布,Android 裝置的行動和桌機運算功能即將緊密整合,而這項重大里程碑已隨著 Android 16 QPR3 版本正式發布!

Google I/O 2025 所示,使用者可透過連結螢幕將 Android 裝置連接至外接螢幕,並立即存取電腦分割視窗環境。應用程式可使用自由形式或最大化視窗,使用者可以像在電腦作業系統上一樣執行多工處理。

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

運作方式

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

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

materialDisplay.gif

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

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

materialDisplay2.gif

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

這很重要嗎?

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


如果您的應用程式是依據自動調整式設計原則建構,就會自動採用電腦版的外觀和風格,讓使用者有賓至如歸的感覺。如果應用程式鎖定為直向,或採用僅限觸控的介面,現在就是進行現代化的好時機。

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

  • 請勿假設 Display 物件保持不變:當應用程式視窗移至外部螢幕,或顯示器設定變更時,與應用程式內容相關聯的 Display 物件可能會變更。應用程式應妥善處理設定變更事件,並動態查詢螢幕指標,而非快取這些指標。
  • 考量密度設定變更外接螢幕的像素密度可能與主要裝置螢幕大不相同。請確保版面配置和資源能正確適應這些變更,維持使用者介面的清晰度和可用性。使用密度獨立像素 (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 會判斷是否可以建立 Scene。將 SceneStrategy 執行個體串連在一起,即可為不同螢幕大小和裝置設定建立及顯示不同場景。

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

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

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 Adaptive 程式庫可協助您建立自動調整式 UI,例如清單/詳細資料和支援窗格版面配置,這些版面配置會根據視窗大小類別或裝置姿勢,自動調整視窗設定。

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

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

currentWindowAdaptiveInfo(supportLargeAndXLargeWidth = true)

開始使用

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

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

意見回饋

我們會持續改善連結螢幕的電腦版體驗,您的意見回饋對我們至關重要。歡迎透過官方意見回饋管道分享想法和回報問題。

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


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

撰寫者:

繼續閱讀