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 docheckEnterPictureInPictureState()
. -
ActivityManagerService
: podstawowy interfejs działania umożliwiający żądanie wprowadzenia PIP oraz interfejs umożliwiający wywołania zWindowManager
iSystemUI
w celu zmiany stanu działania PIP. -
ActivityStackSupervisor
: wywoływany zActivityManagerService
w celu przenoszenia zadań do lub z przypiętego stosu, w razie potrzeby aktualizującWindowManager
. -
PinnedStackWindowController
: interfejsWindowManager
zActivityManager
. -
PinnedStackController
: raportuje zmiany w systemie doSystemUI
, 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
: komponentSystemUI
uruchamiany zSystemUI
. -
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 (zobaczInputConsumerController
). 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 aktualizujeSystemUI
, 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
iconfig_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 wPipSnapAlgorithm
.
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
.