Funkcja obraz w obrazie (PIP) na urządzenia przenośne z Androidem umożliwia użytkownikom zmianę rozmiaru aplikacji z trwającą aktywnością do małego okna. Tryb obraz w obrazie 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ą zmieniać położenie tego okna za pomocą interfejsu SystemUI i wchodzić w interakcje z aplikacją, która jest obecnie wyświetlana w trybie obraz w obrazie, za pomocą maksymalnie 3 dostarczonych przez nią działań.
Tryb obrazu w obrazie wymaga wyraźnego włączenia w aplikacjach, które go obsługują, i działa w przypadku poszczególnych aktywności. (Jedna aplikacja może mieć wiele aktywności, z których tylko jedna jest w trybie obraz w obrazie). Aktywności proszą o włączenie obrazu w obrazie, wywołując funkcję enterPictureInPictureMode()
, i otrzymują wywołania zwrotne w formie onPictureInPictureModeChanged()
.
Metoda setPictureInPictureParams()
umożliwia aktywnościom kontrolowanie proporcji obrazu w trybie obraz w obrazie i w przypadku niestandardowych działań, które pozwalają użytkownikom wchodzić w interakcje z aktywnością bez konieczności jej rozwijania. W trybie obrazu w obrazie aktywność jest wstrzymana, ale renderowana i nie otrzymuje bezpośrednio danych wejściowych dotykowych ani nie jest aktywna.
W danym momencie w trybie obrazu w obrazie może być tylko 1 zadanie.
Więcej informacji znajdziesz w dokumentacji dla deweloperów aplikacji na Androida dotyczącej obrazu w obrazie.
Wymagania dotyczące urządzeń
Aby obsługiwać tryb obrazu w obrazie, włącz funkcję systemową PackageManager#FEATURE_PICTURE_IN_PICTURE
w /android/frameworks/base/core/java/android/content/pm/PackageManager.java
.
Urządzenia obsługujące tryb obrazu w obrazie muszą mieć ekran o najmniejszej szerokości większej niż 220 dp. Podobnie jak w przypadku podzielonego ekranu, tryb obrazu w obrazie umożliwia jednoczesne uruchamianie na ekranie wielu aktywności. Dlatego urządzenia powinny mieć wystarczającą moc obliczeniową procesora i pamięć RAM, aby obsługiwać ten przypadek użycia.
Implementacja
Większość czynności związanych z zarządzaniem cyklem życia aktywności jest wykonywana w systemie w okresie od ActivityManager
do WindowManager
.
Referencyjna implementacja interfejsu użytkownika znajduje się w SystemUI
pakiecie.
Modyfikacje systemu nie powinny wpływać na jego wewnętrzne działanie zdefiniowane przez testy pakietu CTS (Compatibility Test Suite). Logika systemu PIP opiera się głównie na zarządzaniu zadaniami i aktywnościami w „przypiętym” stosie. Oto krótkie omówienie zajęć:
ActivityRecord
: śledzi stan każdego działania w trybie obraz w obrazie. Aby uniemożliwić użytkownikom włączanie trybu obrazu w obrazie w określonych okolicznościach, np. na ekranie blokady lub podczas korzystania z VR, dodaj przypadki docheckEnterPictureInPictureState()
.ActivityManagerService
: główne interfejsy z aktywności do żądania przejścia do trybu obrazu w obrazie oraz interfejsy do wywołań zWindowManager
iSystemUI
w celu zmiany stanu aktywności w trybie obrazu w obrazie.ActivityStackSupervisor
: zadzwonił(a) zActivityManagerService
, aby przenieść zadania do przypiętego stosu lub z niego, aktualizując w razie potrzebyWindowManager
.PinnedStackWindowController
: interfejsWindowManager
zActivityManager
.PinnedStackController
: zgłasza zmiany w systemie doSystemUI
, np. wyświetlanie lub ukrywanie edytora IME, zmianę współczynnika proporcji lub zmianę działań.BoundsAnimationController
: animuje okna aktywności PIP w taki sposób, aby podczas zmiany rozmiaru nie powodować zmiany konfiguracji.PipSnapAlgorithm
: wspólna klasa używana zarówno w systemie, jak i w interfejsie SystemUI, która kontroluje przyciąganie okna obrazu w obrazie do krawędzi ekranu.
Dokumentacja SystemUI
zawiera pełną implementację PIP, która obsługuje wyświetlanie użytkownikom niestandardowych działań i ogólne manipulowanie, takie jak rozwijanie i zamykanie.
Producenci urządzeń mogą wprowadzać dodatkowe zmiany, o ile nie wpływają one na podstawowe zachowania zdefiniowane w CDD. Oto krótki opis zajęć:
PipManager
: komponentSystemUI
uruchamiany za pomocąSystemUI
.PipTouchHandler
: obsługa dotyku, która steruje gestami służącymi do manipulowania obrazem w obrazie. Jest to używane tylko wtedy, gdy aktywny jest odbiorca danych wejściowych dla trybu obraz w obrazie (patrzInputConsumerController
). Można tu dodawać nowe gesty.PipMotionHelper
: klasa pomocnicza, która śledzi pozycję obrazu w obrazie i dozwolony obszar na ekranie. Wywołuje funkcjęActivityManagerService
, aby zaktualizować lub animować położenie i rozmiar okna PIP.PipMenuActivityController
: rozpoczyna działanie, które wyświetla czynności dostępne w aktywności w trybie obraz w obrazie. Ta aktywność jest aktywnością nakładki zadania i usuwa nakładkę konsumenta danych wejściowych, aby umożliwić interakcję.PipMenuActivity
: implementacja działania menu.PipMediaController
: odbiornik, który aktualizujeSystemUI
, gdy sesja multimedialna zmienia się w sposób, który może wpłynąć na domyślne działania w trybie obraz w obrazie.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ą korzystać z trybu obraz w obrazie, aby poinformować ich, że można ją zamknąć.
Domyślne miejsce docelowe
Istnieją różne zasoby systemowe, które kontrolują domyślne umiejscowienie obrazu w obrazie:
config_defaultPictureInPictureGravity
: liczba całkowita gravity, która określa róg, w którym ma się pojawić obraz w obrazie, np.BOTTOM|RIGHT
.config_defaultPictureInPictureScreenEdgeInsets
: odległości od krawędzi ekranu, w których ma się znajdować obraz w obrazie.config_pictureInPictureDefaultSizePercent
iconfig_pictureInPictureDefaultAspectRatio
: połączenie procentu szerokości ekranu i formatu obrazu kontroluje rozmiar obrazu w obrazie. Obliczony domyślny rozmiar obrazu w obrazie nie powinien być mniejszy niż@dimen/default_minimal_size_pip_resizable_task
, zgodnie z definicją w CTS i CDD.config_pictureInPictureSnapMode
: zachowanie przyciągania zdefiniowane wPipSnapAlgorithm
.
Implementacje urządzeń nie powinny zmieniać minimalnych i maksymalnych proporcji obrazu zdefiniowanych w dokumentach CDD i CTS.
Uprawnienia
Ustawienie „Działanie aplikacji” (OP_PICTURE_IN_PICTURE
) w sekcji AppOpsManager
(main/core/java/android/app/AppOpsManager.java
) umożliwia użytkownikom kontrolowanie trybu obrazu w obrazie na poziomie poszczególnych aplikacji za pomocą ustawień systemu.
Implementacje urządzeń muszą uwzględniać to sprawdzenie, gdy aktywność żąda przejścia do trybu obrazu w obrazie.
Testowanie
Aby przetestować implementacje PIP, uruchom wszystkie testy związane z obrazem w obrazie, które znajdują się w testach CTS po stronie hosta w /cts/hostsidetests/services/activitymanager
, a zwłaszcza w ActivityManagerPinnedStackTests.java
.