Функция «картинка в картинке» (PIP) для портативных устройств Android позволяет пользователям изменять размер приложения с текущей активностью в маленьком окне. Картинка в картинке особенно полезна для видеоприложений, поскольку контент продолжает воспроизводиться, пока пользователь может выполнять другие действия. Пользователи могут управлять положением этого окна через SystemUI и взаимодействовать с приложением, которое в настоящее время находится в режиме «картинка в картинке», с помощью (до трех) действий, предоставляемых приложением.
PIP требует явной подписки от приложений, которые его поддерживают, и работает на основе каждого действия. (Одно приложение может иметь несколько действий, только одно из которых находится в режиме PIP.) Действия запрашивают вход в режим «картинка в картинке» с помощью вызова enterPictureInPictureMode()
и получают обратные вызовы действий в форме onPictureInPictureModeChanged()
.
Метод setPictureInPictureParams()
позволяет действиям управлять соотношением сторон в режиме PIP и в настраиваемых действиях, что позволяет пользователям взаимодействовать с действием, не разворачивая его. В PIP действие находится в состоянии паузы, но в состоянии рендеринга, и не получает напрямую сенсорный ввод или фокус окна. Одновременно в PIP может находиться только одна задача.
Дополнительные сведения доступны в документации Android Developer Picture-in-picture .
Требования к устройству
Для поддержки PIP включите системную функцию PackageManager PackageManager#FEATURE_PICTURE_IN_PICTURE
в /android/frameworks/base/core/java/android/content/pm/PackageManager.java
. Устройства, поддерживающие PIP, должны иметь экран с разрешением больше 220 dp при наименьшей ширине. Подобно мультиокну с разделенным экраном, PIP позволяет выполнять несколько действий на экране одновременно. Следовательно, устройства должны иметь достаточно ЦП и ОЗУ для поддержки этого варианта использования.
Реализация
Большая часть управления жизненным циклом активности выполняется в системе между ActivityManager
и WindowManager
. Эталонная реализация пользовательского интерфейса находится в пакете SystemUI
.
Модификации системы не должны влиять на ее внутреннее поведение, как определено тестами Compatibility Test Suite (CTS) . Системная логика PIP в основном вращается вокруг управления задачами и действиями в «закрепленном» стеке. Вот краткий обзор класса:
-
ActivityRecord
: отслеживает состояние «картинка в картинке» каждого действия. Чтобы запретить пользователям входить в PIP в определенных обстоятельствах, например с экрана блокировки или во время виртуальной реальности, добавьте случаи вcheckEnterPictureInPictureState()
. -
ActivityManagerService
: основной интерфейс действия для запроса ввода PIP и интерфейс для вызовов изWindowManager
иSystemUI
для изменения состояния действия PIP. -
ActivityStackSupervisor
: вызывается изActivityManagerService
для перемещения задач в закрепленный стек или из него, при необходимости обновляяWindowManager
. -
PinnedStackWindowController
: интерфейсWindowManager
изActivityManager
. -
PinnedStackController
: сообщает об изменениях в системе вSystemUI
, например об отображении/скрытии IME, изменении соотношения сторон или изменении действий. -
BoundsAnimationController
: анимирует окна активности PIP таким образом, чтобы не запускать изменение конфигурации при изменении размера. -
PipSnapAlgorithm
: общий класс, используемый как в системе, так и в SystemUI, который управляет поведением привязки окна PIP к краям экрана.
Эталонный SystemUI
обеспечивает полную реализацию PIP, которая поддерживает представление настраиваемых действий пользователям и общие манипуляции, такие как расширение и закрытие. Производители устройств могут опираться на эти изменения, если они не влияют на внутреннее поведение, определенное CDD. Вот краткий обзор класса:
-
PipManager
: компонентSystemUI
, который запускается вместе сSystemUI
. -
PipTouchHandler
: обработчик касания, который управляет жестами, управляющими PIP. Это используется только тогда, когда потребитель ввода для PIP активен (см.InputConsumerController
). Здесь можно добавить новые жесты. -
PipMotionHelper
: удобный класс, который отслеживает положение PIP и допустимую область на экране. ВызываетActivityManagerService
для обновления или анимации положения и размера PIP. -
PipMenuActivityController
: запускает действие, которое показывает действия, предоставляемые действием, которое в настоящее время находится в PIP. Это действие представляет собой действие с наложением задач и удаляет наложенный потребитель ввода, чтобы сделать его интерактивным. -
PipMenuActivity
: реализация активности меню. -
PipMediaController
: прослушиватель, который обновляетSystemUI
, когда сеанс мультимедиа изменяется таким образом, что это может повлиять на действия по умолчанию в PIP. -
PipNotificationController
: контроллер, который гарантирует, что уведомление будет активным, пока пользователь использует функцию PIP. -
PipDismissViewController
: наложение, отображаемое пользователям, когда они начинают взаимодействовать с PIP, чтобы указать, что его можно закрыть.
Размещение по умолчанию
Существуют различные системные ресурсы, которые управляют размещением PIP по умолчанию:
-
config_defaultPictureInPictureGravity
: целое число гравитации , которое управляет углом для размещения PIP, напримерBOTTOM|RIGHT
. -
config_defaultPictureInPictureScreenEdgeInsets
: смещения от сторон экрана для размещения PIP. -
config_pictureInPictureDefaultSizePercent
иconfig_pictureInPictureDefaultAspectRatio
: сочетание процента ширины экрана и соотношения сторон управляет размером PIP. Вычисленный размер PIP по умолчанию не должен быть меньше, чем@dimen/default_minimal_size_pip_resizable_task
, как определено CTS и CDD. -
config_pictureInPictureSnapMode
: поведение привязки, определенное вPipSnapAlgorithm
.
Реализации устройств не должны изменять минимальное и максимальное соотношение сторон, определенные в CDD и CTS.
Разрешения
«Операция приложения» для каждого пакета ( OP_PICTURE_IN_PICTURE
) в AppOpsManager
( master/core/java/android/app/AppOpsManager.java
) позволяет пользователям управлять PIP на уровне каждого приложения через системные настройки. Реализации устройств должны соблюдать эту проверку, когда действие запрашивает вход в режим «картинка в картинке».
Тестирование
Чтобы протестировать реализации PIP, запустите все тесты, связанные с картинкой в картинке, найденные в тестах CTS на стороне хоста в /cts/hostsidetests/services/activitymanager
, особенно в ActivityManagerPinnedStackTests.java
.