Obraz w obrazie

Funkcja obrazu w obrazie (PIP) dla urządzeń przenośnych z systemem Android umożliwia użytkownikom zmianę rozmiaru aplikacji z trwającą aktywnością w małym oknie. PIP jest szczególnie przydatny w aplikacjach wideo, ponieważ zawartość jest odtwarzana, a użytkownik może wykonywać inne czynności. Użytkownicy mogą manipulować położeniem tego okna za pomocą SystemUI i wchodzić w interakcję z aplikacją aktualnie wyświetlaną w trybie obrazu w obrazie za pomocą (maksymalnie trzech) akcji udostępnianych przez aplikację.

PIP wymaga wyraźnej zgody ze strony obsługujących go aplikacji i działa w oparciu o poszczególne działania. (Pojedyncza aplikacja może mieć wiele działań, z których tylko jedno jest w formacie PIP.) Działania żądają wprowadzenia obrazu w obrazie poprzez wywołanie enterPictureInPictureMode() i odbierają wywołania zwrotne działań w postaci onPictureInPictureModeChanged() .

Metoda setPictureInPictureParams() umożliwia kontrolowanie proporcji działań w trybie PIP oraz w akcjach niestandardowych, co pozwala użytkownikom na interakcję z działaniem bez konieczności jego rozwijania. W trybie PIP aktywność jest w stanie wstrzymania, ale jest renderowana i nie jest bezpośrednio odbierana przez dotyk ani fokus okna. W danym momencie w PIP może znajdować się tylko jedno zadanie.

Więcej informacji można znaleźć w dokumentacji obrazu w obrazie dla programistów Androida.

Wymagania dotyczące urządzenia

Aby obsługiwać PIP, włącz funkcję systemową PackageManager#FEATURE_PICTURE_IN_PICTURE w pliku /android/frameworks/base/core/java/android/content/pm/PackageManager.java . Urządzenia obsługujące PIP muszą mieć ekran większy niż 220 dp przy najmniejszej szerokości. Podobnie jak w przypadku wielu okien z podzielonym ekranem, funkcja PIP umożliwia jednoczesne wykonywanie wielu czynności na ekranie. Dlatego urządzenia powinny mieć wystarczającą ilość procesora i pamięci RAM, aby obsłużyć ten przypadek użycia.

Realizacja

Większość zarządzania cyklem życia aktywności odbywa się w systemie pomiędzy ActivityManager i WindowManager . Referencyjna implementacja interfejsu użytkownika znajduje się w pakiecie SystemUI .

Modyfikacje systemu nie powinny wpływać na jego wewnętrzne zachowanie określone w testach pakietu Compatibility Test Suite (CTS) . Logika systemu PIP koncentruje się głównie na zarządzaniu zadaniami i działaniami w ramach „przypiętego” stosu. Oto krótki przegląd zajęć:

  • ActivityRecord : śledzi stan obrazu w obrazie każdego działania. Aby uniemożliwić użytkownikom wprowadzanie PIP w określonych okolicznościach, na przykład na ekranie blokady lub podczas rzeczywistości wirtualnej, dodaj przypadki do checkEnterPictureInPictureState() .
  • ActivityManagerService : podstawowy interfejs działania umożliwiający żądanie wprowadzenia PIP oraz interfejs umożliwiający wywołania z WindowManager i SystemUI w celu zmiany stanu działania PIP.
  • ActivityStackSupervisor : wywoływany z ActivityManagerService w celu przenoszenia zadań do lub z przypiętego stosu, w razie potrzeby aktualizując WindowManager .
  • PinnedStackWindowController : interfejs WindowManager z ActivityManager .
  • PinnedStackController : raportuje zmiany w systemie do SystemUI , takie jak pokazanie/ukrycie IME, zmiana proporcji lub zmiana działań.
  • BoundsAnimationController : animuje okna aktywności PIP w sposób, który nie powoduje zmiany konfiguracji podczas zmiany rozmiaru.
  • PipSnapAlgorithm : klasa współdzielona używana zarówno w systemie, jak i w SystemUI, która kontroluje zachowanie przyciągania okna PIP w pobliżu krawędzi ekranu.

Referencyjny SystemUI zapewnia pełną implementację PIP, która obsługuje prezentowanie użytkownikom niestandardowych działań i ogólną manipulację, taką jak rozszerzanie i zwalnianie. Producenci urządzeń mogą opierać się na tych zmianach, o ile nie wpływają one na wewnętrzne zachowania określone w CDD. Oto krótki przegląd zajęć:

  • PipManager : komponent SystemUI uruchamiany z SystemUI .
  • PipTouchHandler : moduł obsługi dotyku, który kontroluje gesty manipulujące PIP. Jest to używane tylko wtedy, gdy odbiornik wejściowy dla PIP jest aktywny (zobacz InputConsumerController ). Tutaj można dodać nowe gesty.
  • PipMotionHelper : wygodna klasa, która śledzi pozycję PIP i dozwolony region na ekranie. Wywołuje usługę ActivityManagerService w celu aktualizacji lub animacji położenia i rozmiaru PIP.
  • PipMenuActivityController : rozpoczyna działanie, które pokazuje działania zapewniane przez działanie aktualnie w PIP. To działanie jest działaniem nakładającym zadanie i usuwa nakładającego się konsumenta wejściowego, aby umożliwić mu interaktywność.
  • PipMenuActivity : implementacja działania menu.
  • PipMediaController : odbiornik, który aktualizuje SystemUI , gdy sesja medialna zmienia się w sposób, który może mieć wpływ na domyślne działania w PIP.
  • PipNotificationController : kontroler zapewniający, że powiadomienie jest aktywne, gdy użytkownik korzysta z funkcji PIP.
  • PipDismissViewController : nakładka wyświetlana użytkownikom, gdy rozpoczynają interakcję z PIP, wskazująca, że ​​można ją odrzucić.

Domyślne miejsce docelowe

Istnieją różne zasoby systemowe kontrolujące domyślne rozmieszczenie PIP:

  • config_defaultPictureInPictureGravity : liczba całkowita grawitacji , która kontroluje narożnik, w którym ma zostać umieszczony PIP, np. BOTTOM|RIGHT .
  • config_defaultPictureInPictureScreenEdgeInsets : przesunięcia od boków ekranu w celu umieszczenia PIP.
  • config_pictureInPictureDefaultSizePercent i config_pictureInPictureDefaultAspectRatio : kombinacja procentu szerokości ekranu i współczynnika proporcji kontroluje rozmiar PIP. 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 urządzeń nie powinny zmieniać minimalnych i maksymalnych współczynników proporcji zdefiniowanych w CDD i CTS.

Uprawnienia

„Operacja aplikacji” na pakiet ( OP_PICTURE_IN_PICTURE ) w AppOpsManager ( main/core/java/android/app/AppOpsManager.java ) umożliwia użytkownikom kontrolowanie PIP na poziomie poszczególnych aplikacji poprzez ustawienia systemowe. Implementacje urządzeń muszą uwzględniać tę kontrolę, gdy działanie żąda przejścia w tryb obrazu w obrazie.

Testowanie

Aby przetestować implementacje PIP, uruchom wszystkie testy związane z obrazem w obrazie, które znajdziesz w testach CTS po stronie hosta w /cts/hostsidetests/services/activitymanager , szczególnie w ActivityManagerPinnedStackTests.java .