Funkcja obrazu w obrazie (PIP) na urządzeniach przenośnych z Androidem umożliwia użytkownikom zmianę rozmiaru aplikacji z działającą aktywnością na małe okno. Tryb PIP jest szczególnie przydatny w przypadku aplikacji wideo, ponieważ treści są nadal odtwarzane, a użytkownik może wykonywać inne czynności. Użytkownicy mogą manipulować położeniem okna za pomocą interfejsu SystemUI i działać w aplikacji, która jest w trybie obrazu w obrazie, wykonując do 3 działań udostępnionych przez aplikację.
Tryb obrazu w obrazie wymaga wyraźnej zgody aplikacji, które go obsługują, i działa na podstawie aktywności. (jedna aplikacja może mieć wiele aktywności, ale tylko jedna z nich może być wyświetlana w trybie obrazu w obrazie). Aktywności proszą o włączenie obrazu w obrazie, wywołując funkcję enterPictureInPictureMode()
, i odbierają wywołania zwrotne aktywności w formie onPictureInPictureModeChanged()
.
Metoda setPictureInPictureParams()
umożliwia kontrolowanie przez aktywność jej proporcji w trybie obrazu w obrazie oraz wykonywanie działań niestandardowych, które pozwalają użytkownikom na interakcję z aktywizacją bez konieczności jej rozwinięcia. W trybie obrazu w obrazie aktywność jest wstrzymana, ale nadal renderowana. Nie otrzymuje bezpośrednio danych z ekranu dotykowego ani nie jest w centrum uwagi.
W trybie obrazu w obrazie można wyświetlać tylko jedno zadanie naraz.
Więcej informacji znajdziesz w dokumentacji dla deweloperów Androida dotyczącej okna Picture-in-picture.
Wymagania dotyczące urządzeń
Aby korzystać z PIP, włącz funkcję systemu PackageManager#FEATURE_PICTURE_IN_PICTURE
w /android/frameworks/base/core/java/android/content/pm/PackageManager.java
.
Urządzenia obsługujące tryb PIP muszą mieć ekran o szerokości większej niż 220 dp. Podobnie jak w przypadku okna wielozadaniowego na podzielonym ekranie, tryb obrazu w obrazie umożliwia jednoczesne uruchamianie wielu działań na ekranie. Dlatego urządzenia powinny mieć wystarczającą ilość pamięci RAM i procesora, aby obsługiwać ten przypadek użycia.
Implementacja
Większość czynności związanych z cyklem życia aktywności jest wykonywana w systemie w okresie od ActivityManager
do WindowManager
.
Referencyjny interfejs użytkownika znajduje się w pakiecie SystemUI
.
Modyfikacje systemu nie powinny wpływać na jego działanie, jak zostało określone w testach Compatibility Test Suite (CTS). Logika systemu PIP dotyczy głównie zarządzania zadaniami i czynnościami w ramach „przypiętej” grupy. Oto krótkie omówienie zajęć:
ActivityRecord
: śledzi stan obrazu w oknie w przypadku każdej aktywności. Aby uniemożliwić użytkownikom uruchamianie trybu obrazu w obrazie w określonych okolicznościach, np. na ekranie blokady lub w trybie VR, dodaj przypadki docheckEnterPictureInPictureState()
.ActivityManagerService
: główny interfejs z aplikacji do żądania wejścia do okna PIP oraz interfejs do wywołania z poziomuWindowManager
iSystemUI
do zmiany stanu aktywności okna PIP.ActivityStackSupervisor
: wywoływana z poziomuActivityManagerService
, aby przenosić zadania do lub z przypiętego stosu, aktualizując odpowiednioWindowManager
.PinnedStackWindowController
: interfejsWindowManager
zActivityManager
.PinnedStackController
: raportuje zmiany w systemieSystemUI
, takie jak wyświetlanie lub ukrywanie IME, zmiana formatu obrazu lub zmiana działań.BoundsAnimationController
: animuje okna aktywności PIP w sposób, który nie powoduje zmiany konfiguracji podczas zmiany rozmiaru.PipSnapAlgorithm
: współdzielona klasa używana zarówno w systemie, jak i w SystemUI, która kontroluje przyciąganie okna PIP w pobliżu krawędzi ekranu.
Plik referencyjny SystemUI
zawiera pełną implementację trybu Picture-in-picture, która umożliwia wyświetlanie użytkownikom niestandardowych działań i ogólnych manipulacji, takich jak powiększenie i zmniejszenie okna.
Producenci urządzeń mogą stosować te zmiany, o ile nie wpływają one na działania własne zdefiniowane w CDD. Oto krótkie omówienie zajęć:
PipManager
: komponentSystemUI
, który rozpoczyna się odSystemUI
.PipTouchHandler
: element obsługi dotykowej, który kontroluje gesty manipulujące PIP. Jest on używany tylko wtedy, gdy element wejściowy konsument PIP jest aktywny (patrzInputConsumerController
). Tutaj można dodawać nowe gesty.PipMotionHelper
: wygodna klasa, która śledzi pozycję obrazu w powiększeniu i dozwolony obszar na ekranie. wywołujeActivityManagerService
, aby zaktualizować lub animować położenie i rozmiar okna PIP.PipMenuActivityController
: uruchamia aktywność, która wyświetla działania dostępne w ramach tej aktywności w trybie obrazu w wyświetlaczu. To zadanie jest zadaniem nakładającym się na inne zadania i usuwa nakładający się element interfejsu użytkownika, aby umożliwić interakcję.PipMenuActivity
: implementacja aktywności menu.PipMediaController
: odbiorca, który aktualizuje sięSystemUI
, gdy sesja multimediów ulegnie zmianie w sposób, który może wpłynąć na domyślne działania w oknie Picture-in-Picture.PipNotificationController
: kontroler, który zapewnia, że powiadomienie jest aktywne, gdy użytkownik korzysta z funkcji obrazu w obrazie.PipDismissViewController
: nakładka wyświetlana użytkownikom, gdy zaczynają oni korzystać z trybu PIP, aby wskazać, że można go zamknąć.
Miejsce docelowe domyślne
Istnieją różne zasoby systemowe, które kontrolują domyślne umieszczanie PIP:
config_defaultPictureInPictureGravity
: gravity liczba całkowita, która określa narożnik, w którym ma się znajdować PIP, np.BOTTOM|RIGHT
.config_defaultPictureInPictureScreenEdgeInsets
: przesunięcie od krawędzi ekranu, aby umieścić PIP.config_pictureInPictureDefaultSizePercent
iconfig_pictureInPictureDefaultAspectRatio
: kombinacja procentu szerokości ekranu i formatu obrazu kontroluje rozmiar obrazu w okienku. Obliczony domyślny rozmiar PIP nie powinien być mniejszy niż@dimen/default_minimal_size_pip_resizable_task
, zgodnie z definicją CTS i CDD.config_pictureInPictureSnapMode
: zachowanie przyciągania zdefiniowane wPipSnapAlgorithm
.
Implementacje na urządzeniach nie powinny zmieniać minimalnych i maksymalnych proporcji, które są określone w CDD i CTS.
Uprawnienia
Operacja „aplikacja” (OP_PICTURE_IN_PICTURE
) w pakiecie AppOpsManager
(main/core/java/android/app/AppOpsManager.java
) pozwala użytkownikom kontrolować PIP na poziomie aplikacji za pomocą ustawień systemowych.
Implementacje na urządzeniu muszą uwzględniać to sprawdzanie, gdy aktywność prosi o wejście do trybu obrazu w obrazie.
Testowanie
Aby przetestować implementacje PIP, uruchom wszystkie testy związane z obrazem w obrazie w ramach testów CTS po stronie hosta w sekcji /cts/hostsidetests/services/activitymanager
, szczególnie w ActivityManagerPinnedStackTests.java
.