Obraz w obrazie

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/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 do checkEnterPictureInPictureState().
  • ActivityManagerService: główny interfejs z aplikacji do żądania wejścia do okna PIP oraz interfejs do wywołania z poziomu WindowManagerSystemUI do zmiany stanu aktywności okna PIP.
  • ActivityStackSupervisor: wywoływana z poziomu ActivityManagerService w celu przenoszenia zadań do lub z przypiętego stosu oraz aktualizowania elementu WindowManager w razie potrzeby.
  • PinnedStackWindowController: interfejs WindowManager z ActivityManager.
  • PinnedStackController: raporty o zmianach w systemie SystemUI, 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 SystemUIzawiera 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: komponent SystemUI, który rozpoczyna się od SystemUI.
  • 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 (patrz InputConsumerController). Tutaj można dodawać nowe gesty.
  • PipMotionHelper: wygodna klasa, która śledzi pozycję obrazu w powiększeniu i dozwolony obszar na ekranie. wywołuje ActivityManagerService, 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 i config_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 w PipSnapAlgorithm.

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.