Функция «картинка в картинке» (PIP) на мобильных устройствах Android позволяет пользователям изменять размер приложения, в котором выполняется текущая активность, до небольшого окна. PIP особенно полезна для видеоприложений, поскольку контент продолжает воспроизводиться, пока пользователь может выполнять другие действия. Пользователи могут изменять положение этого окна через SystemUI и взаимодействовать с приложением, находящимся в режиме «картинка в картинке», с помощью (до трех) действий, предоставляемых приложением.
Для включения режима «картинка в картинке» требуется явное согласие приложений, поддерживающих эту функцию, и он работает для каждой активности отдельно. (Одно приложение может иметь несколько активностей, только одна из которых находится в режиме «картинка в картинке».) Активности запрашивают переход в режим «картинка в картинке», вызывая enterPictureInPictureMode() , и получают обратные вызовы активности в виде метода onPictureInPictureModeChanged() .
Метод setPictureInPictureParams() позволяет активностям управлять соотношением сторон в режиме «картинка в картинке» (PIP) и пользовательскими действиями, которые позволяют пользователям взаимодействовать с активностью, не разворачивая её. В режиме PIP активность находится в приостановленном, но отрисовываемом состоянии и не получает напрямую сенсорный ввод или фокус окна. В режиме PIP одновременно может находиться только одна задача.
Более подробная информация доступна в документации Android Developer по функции «Картинка в картинке» .
Требования к устройству
Для поддержки режима «картинка в картинке» (PIP) необходимо включить системную функцию PackageManager#FEATURE_PICTURE_IN_PICTURE в файле /android/frameworks/base/core/java/android/content/pm/PackageManager.java . Устройства, поддерживающие PIP, должны иметь экран с разрешением более 220dp при минимальной ширине. Подобно многооконному режиму с разделенным экраном, PIP позволяет одновременно запускать несколько действий на экране. Следовательно, устройства должны обладать достаточными ресурсами процессора и оперативной памяти для поддержки этого сценария использования.
Выполнение
Большая часть управления жизненным циклом активности осуществляется в системе между ActivityManager и WindowManager . Эталонная реализация пользовательского интерфейса находится в пакете SystemUI .
Изменения в системе не должны влиять на её внутреннее поведение, определяемое тестами набора тестов совместимости (CTS) . Логика системы для PIP в основном сосредоточена на управлении задачами и действиями в рамках «закреплённого» стека. Вот краткий обзор класса:
-
ActivityRecord: отслеживает состояние «картинка в картинке» для каждого действия. Чтобы предотвратить переход пользователей в режим «картинка в картинке» в определенных ситуациях, например, с экрана блокировки или во время VR, добавьте варианты действий вcheckEnterPictureInPictureState(). -
ActivityManagerService: основной интерфейс от активности для запроса перехода в режим «картинка в картинке» (PIP) и интерфейс для вызовов изWindowManagerиSystemUIдля изменения состояния активности в режиме «картинка в картинке». -
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: запускает активность, которая отображает действия, предоставляемые активностью, находящейся в данный момент в режиме «картинка в картинке». Эта активность является активностью-наложением задачи и удаляет наложенный потребитель ввода, чтобы обеспечить интерактивность. -
PipMenuActivity: реализация для активности меню. -
PipMediaController: обработчик событий, который обновляетSystemUIпри изменении медиасессии, которое может повлиять на действия по умолчанию в режиме «картинка в картинке». -
PipNotificationController: контроллер, который гарантирует, что уведомление активно, пока пользователь использует функцию «картинка в картинке». -
PipDismissViewController: всплывающее окно, отображаемое пользователям при начале взаимодействия с PIP, указывающее на возможность его закрытия.
Размещение по умолчанию
Существуют различные системные ресурсы, которые управляют размещением PIP-файла по умолчанию:
-
config_defaultPictureInPictureGravity: целочисленное значение параметра gravity , определяющее угол, в котором будет располагаться PIP (картинка в картинке), например,BOTTOM|RIGHT. -
config_defaultPictureInPictureScreenEdgeInsets: смещение относительно краев экрана для размещения режима «картинка в картинке». -
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 ( main/core/java/android/app/AppOpsManager.java ), выполняемая для каждого пакета, позволяет пользователям управлять режимом «картинка в картинке» на уровне приложения через системные настройки. Реализации устройств должны учитывать эту проверку, когда активность запрашивает переход в режим «картинка в картинке».
Тестирование
Для проверки реализации PIP запустите все тесты, связанные с режимом «картинка в картинке», которые находятся в тестах CTS на стороне хоста в каталоге /cts/hostsidetests/services/activitymanager , в частности, в файле ActivityManagerPinnedStackTests.java .