Funkcja obrazu w obrazie (PIP) na urządzeniach mobilnych z Androidem pozwala użytkownikom zmienić rozmiar 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ą 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 jest w trybie pełnoekranowym). 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 formatu obrazu w trybie obrazu w powietrzu i działań niestandardowych, co pozwala użytkownikom na interakcję z aktywnością bez konieczności jej powiększenia. W trybie PIP aktywność jest wstrzymana, ale nadal renderowana. Nie otrzymuje bezpośrednio danych z dotyku 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 aplikacji na Androida dotyczącej okna Picture-in-picture.
Wymagania dotyczące urządzeń
Aby włączyć tryb obrazu w pliku, włącz funkcję PackageManager#FEATURE_PICTURE_IN_PICTURE
w /android/frameworks/base/core/java/android/content/pm/PackageManager.java
.
Urządzenia obsługujące 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 grupie „przypiętej”. 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
w celu przenoszenia zadań do lub z przypiętego stosu oraz aktualizowania elementuWindowManager
w razie potrzeby.PinnedStackWindowController
: interfejsWindowManager
zActivityManager
.PinnedStackController
: raporty o zmianach w systemieSystemUI
, takich 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ę PIP, która umożliwia wyświetlanie niestandardowych działań dla użytkowników i ogólne manipulowanie, takie jak powiększanie i zamykanie.
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 dla 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ć pozycję 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 mieć wpływ 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 powiększeniu.PipDismissViewController
: nakładka wyświetlana użytkownikom, gdy zaczynają oni wchodzić w interakcję z trybem PIP, aby wskazać, że można go zamknąć.
Miejsce docelowe domyślne
Istnieją różne zasoby systemowe, które kontrolują domyślne umieszczenie 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 współczynników proporcji określonych 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 urządzeń 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
.