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,才能支援這種使用情境。
實作
大部分的活動生命週期管理作業都是在 ActivityManager
和 WindowManager
之間的系統中完成。參考 UI 實作項目位於 SystemUI
套件中。
系統修改作業不應影響 Compatibility Test Suite (CTS) 測試定義的內建行為。子母畫面系統邏輯主要圍繞在「已釘選」堆疊中的工作和活動管理。以下是課程的快速總覽:
ActivityRecord
:追蹤每項活動的子母畫面狀態。如要禁止使用者在特定情況下進入子母畫面模式,例如從螢幕鎖定畫面或在 VR 期間,請將案例新增至checkEnterPictureInPictureState()
。ActivityManagerService
:活動的主要介面,用於要求進入子母畫面模式,以及從WindowManager
和SystemUI
呼叫的介面,用於變更子母畫面活動狀態。ActivityStackSupervisor
:從ActivityManagerService
呼叫,將工作移入或移出釘選堆疊,並視需要更新WindowManager
。PinnedStackWindowController
:WindowManager
介面,來自ActivityManager
。PinnedStackController
:向SystemUI
回報系統的變更,例如顯示/隱藏 IME、變更顯示比例或變更動作。BoundsAnimationController
:以不會在調整大小時觸發設定變更的方式,為子母畫面活動視窗製作動畫。PipSnapAlgorithm
:系統和 SystemUI 中使用的共用類別,可控制 PIP 視窗在螢幕邊緣附近的貼齊行為。
參考資料 SystemUI
完整實作 PIP,支援向使用者顯示自訂動作,以及一般操作,例如展開和關閉。
只要不影響 CDD 定義的內建行為,裝置製造商就能根據這些變更進行建構。以下是課程的快速總覽:
PipManager
:以SystemUI
啟動的SystemUI
元件。PipTouchHandler
:觸控處理常式,可控制操作子母畫面的手勢。只有在 PIP 的輸入內容取用者處於啟用狀態時,才會使用這項功能 (請參閱InputConsumerController
)。您可以在這裡新增手勢。PipMotionHelper
:便利類別,可追蹤子母畫面位置和螢幕上允許的區域。透過ActivityManagerService
呼叫,更新或製作子母畫面位置和大小的動畫。PipMenuActivityController
:啟動活動,顯示目前在子母畫面模式中活動提供的動作。這項活動是工作疊加活動,會移除疊加的輸入內容消費者,允許互動。PipMenuActivity
:選單活動的實作項目。PipMediaController
:監聽器,會在媒體工作階段發生可能影響子母畫面預設動作的變更時,更新SystemUI
。PipNotificationController
:這個控制器可確保使用者使用子母畫面功能時,通知會保持啟用狀態。PipDismissViewController
:使用者開始與子母畫面互動時顯示的疊加畫面,表示可以關閉子母畫面。
預設刊登位置
有各種系統資源可控管子母畫面的預設位置:
config_defaultPictureInPictureGravity
:重力整數,可控制放置子母畫面 (PIP) 的角落,例如BOTTOM|RIGHT
。config_defaultPictureInPictureScreenEdgeInsets
: 從螢幕側邊到放置子母畫面的偏移量。config_pictureInPictureDefaultSizePercent
和config_pictureInPictureDefaultAspectRatio
:螢幕寬度百分比和顯示比例的組合會控制子母畫面的大小。根據 CTS 和 CDD 的定義,計算出的預設子母畫面大小不得小於@dimen/default_minimal_size_pip_resizable_task
。config_pictureInPictureSnapMode
:如PipSnapAlgorithm
中所定義的對齊行為。
裝置實作項目不應變更 CDD 和 CTS 中定義的最小和最大顯示比例。
權限
使用者可透過系統設定,在應用程式層級控管子母畫面功能。方法是前往「應用程式作業」OP_PICTURE_IN_PICTURE
,然後在「套件」AppOpsManager
main/core/java/android/app/AppOpsManager.java
中進行設定。當活動要求進入子母畫面模式時,裝置實作項目必須遵守這項檢查。
測試
如要測試子母畫面實作項目,請執行 /cts/hostsidetests/services/activitymanager
底下主機端 CTS 測試中的所有子母畫面相關測試,特別是 ActivityManagerPinnedStackTests.java
中的測試。