Obraz w obrazie

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/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 do checkEnterPictureInPictureState().
  • ActivityManagerService: główne interfejsy z aktywności do żądania przejścia do trybu obrazu w obrazie oraz interfejsy do wywołań z WindowManagerSystemUI w celu zmiany stanu aktywności w trybie obrazu w obrazie.
  • ActivityStackSupervisor: zadzwonił(a) z ActivityManagerService, aby przenieść zadania do przypiętego stosu lub z niego, aktualizując w razie potrzeby WindowManager.
  • PinnedStackWindowController: interfejs WindowManagerActivityManager.
  • PinnedStackController: zgłasza zmiany w systemie do SystemUI, 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: komponent SystemUI 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 (patrz InputConsumerController). 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 aktualizuje SystemUI, 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_pictureInPictureDefaultSizePercentconfig_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 w PipSnapAlgorithm.

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.