產品最新消息

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

閱讀時間:7 分鐘
查看 Francesco Romano 的個人資料
Francesco Romano Android 開發人員關係工程師

我們很高興宣布,Android 在整合行動和電腦運算方面,達成了一項重大里程碑:Android 16 QPR3 版本正式發布,支援外接螢幕!

如 Google I/O 2025 所示,使用者可以將 Android 裝置連接到外接螢幕,立即存取電腦分割視窗環境。應用程式可在任意形式或最大化視窗中使用,使用者可以像在電腦 OS 上一樣執行多項工作。

Google 和 Samsung 攜手合作,為搭載 Android 16 的 Android 生態系統裝置,提供流暢強大的電腦分割視窗體驗,只要連接外接螢幕即可使用。
這項功能現已正式發布,支援的裝置* 使用者可將 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 會決定是否能建立 Scene。將 SceneStrategy 例項鏈結在一起,即可針對不同螢幕大小和裝置設定建立及顯示不同場景。

如果是清單詳細資料和支援窗格等現成標準版面配置,您可以使用 Compose Material 3 Adaptive 程式庫中的場景 (適用於 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 Adaptive 程式庫建立自動調整式 UI,例如清單詳細資料和支援窗格版面配置,這些版面配置會根據視窗大小類別或裝置狀態,自動調整為視窗設定。

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

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

currentWindowAdaptiveInfo(supportLargeAndXLargeWidth = true)

開始使用

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

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

意見回饋

我們會持續改善外接螢幕的桌面模式體驗,因此你的意見回饋至關重要。歡迎透過官方意見回饋管道分享想法或回報問題。

我們致力將 Android 打造為多功能平台,滿足使用者與應用程式和裝置互動的各種需求。我們對外接螢幕支援功能的改善,是朝這個方向邁出的另一步,相信使用者會喜歡您打造的桌面體驗!


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

作者:
繼續閱讀