子母畫面

Android 手持裝置的子母畫面 (PIP) 功能可讓使用者將正在進行活動的應用程式縮放為小視窗。子母畫面特別適合影片應用程式,因為使用者可以執行其他動作,影片內容仍會繼續播放。使用者可以透過 SystemUI 操作這個視窗的位置,並透過 (最多三個) 應用程式提供的動作,與目前處於子母畫面模式的應用程式互動。

應用程式必須明確選擇加入,才能支援子母畫面功能,且這項功能是以活動為單位運作。(單一應用程式可以有多個活動,但只有一個活動會進入子母畫面模式)。活動會呼叫 enterPictureInPictureMode() 要求進入子母畫面,並以 onPictureInPictureModeChanged() 的形式接收活動回呼。

活動可透過 setPictureInPictureParams() 方法控制子母畫面和自訂動作中的顯示比例,讓使用者與活動互動,不必展開活動。在子母畫面中,活動會處於暫停但正在算繪的狀態,不會直接接收觸控輸入或視窗焦點。一次只能有一個工作進入子母畫面模式。

詳情請參閱 Android 開發人員的子母畫面說明文件。

裝置需求

如要支援子母畫面,請在 /android/frameworks/base/core/java/android/content/pm/PackageManager.java 中啟用 PackageManager#FEATURE_PICTURE_IN_PICTURE 系統功能。支援子母畫面的裝置,最小寬度必須大於 220 dp。與分割畫面多視窗類似,子母畫面可讓多個活動同時在螢幕上執行。因此,裝置應具備足夠的 CPU 和 RAM,才能支援這種使用情境。

實作

大部分的活動生命週期管理作業都是在 ActivityManagerWindowManager 之間的系統中完成。參考 UI 實作項目位於 SystemUI 套件中。

系統修改作業不應影響 Compatibility Test Suite (CTS) 測試定義的內建行為。子母畫面系統邏輯主要圍繞在「已釘選」堆疊中的工作和活動管理。以下是課程的快速總覽:

  • ActivityRecord追蹤每項活動的子母畫面狀態。如要禁止使用者在特定情況下進入子母畫面模式,例如從螢幕鎖定畫面或在 VR 期間,請將案例新增至 checkEnterPictureInPictureState()
  • ActivityManagerService活動的主要介面,用於要求進入子母畫面模式,以及從 WindowManagerSystemUI 呼叫的介面,用於變更子母畫面活動狀態。
  • ActivityStackSupervisorActivityManagerService 呼叫,將工作移入或移出釘選堆疊,並視需要更新 WindowManager
  • PinnedStackWindowControllerWindowManager介面,來自 ActivityManager
  • PinnedStackControllerSystemUI 回報系統的變更,例如顯示/隱藏 IME、變更顯示比例或變更動作。
  • BoundsAnimationController以不會在調整大小時觸發設定變更的方式,為子母畫面活動視窗製作動畫。
  • PipSnapAlgorithm系統和 SystemUI 中使用的共用類別,可控制 PIP 視窗在螢幕邊緣附近的貼齊行為。

參考資料 SystemUI 完整實作 PIP,支援向使用者顯示自訂動作,以及一般操作,例如展開和關閉。 只要不影響 CDD 定義的內建行為,裝置製造商就能根據這些變更進行建構。以下是課程的快速總覽:

  • PipManagerSystemUI 啟動的 SystemUI 元件。
  • PipTouchHandler觸控處理常式,可控制操作子母畫面的手勢。只有在 PIP 的輸入內容取用者處於啟用狀態時,才會使用這項功能 (請參閱 InputConsumerController)。您可以在這裡新增手勢。
  • PipMotionHelper便利類別,可追蹤子母畫面位置和螢幕上允許的區域。透過 ActivityManagerService 呼叫,更新或製作子母畫面位置和大小的動畫。
  • PipMenuActivityController啟動活動,顯示目前在子母畫面模式中活動提供的動作。這項活動是工作疊加活動,會移除疊加的輸入內容消費者,允許互動。
  • PipMenuActivity選單活動的實作項目。
  • PipMediaController監聽器,會在媒體工作階段發生可能影響子母畫面預設動作的變更時,更新 SystemUI
  • PipNotificationController這個控制器可確保使用者使用子母畫面功能時,通知會保持啟用狀態。
  • PipDismissViewController使用者開始與子母畫面互動時顯示的疊加畫面,表示可以關閉子母畫面。

預設刊登位置

有各種系統資源可控管子母畫面的預設位置:

  • config_defaultPictureInPictureGravity重力整數,可控制放置子母畫面 (PIP) 的角落,例如 BOTTOM|RIGHT
  • config_defaultPictureInPictureScreenEdgeInsets 從螢幕側邊到放置子母畫面的偏移量。
  • config_pictureInPictureDefaultSizePercentconfig_pictureInPictureDefaultAspectRatio螢幕寬度百分比和顯示比例的組合會控制子母畫面的大小。根據 CTS 和 CDD 的定義,計算出的預設子母畫面大小不得小於 @dimen/default_minimal_size_pip_resizable_task
  • config_pictureInPictureSnapModePipSnapAlgorithm 中所定義的對齊行為。

裝置實作項目不應變更 CDD 和 CTS 中定義的最小和最大顯示比例。

權限

使用者可透過系統設定,在應用程式層級控管子母畫面功能。方法是前往「應用程式作業」OP_PICTURE_IN_PICTURE,然後在「套件」AppOpsManagermain/core/java/android/app/AppOpsManager.java 中進行設定。當活動要求進入子母畫面模式時,裝置實作項目必須遵守這項檢查。

測試

如要測試子母畫面實作項目,請執行 /cts/hostsidetests/services/activitymanager 底下主機端 CTS 測試中的所有子母畫面相關測試,特別是 ActivityManagerPinnedStackTests.java 中的測試。