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 SystemUIpakiecie.
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ń zWindowManageriSystemUIw 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: interfejsWindowManagerzActivityManager.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 SystemUIzawiera 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: komponentSystemUIuruchamiany 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_pictureInPictureDefaultSizePercenticonfig_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.