Картинка в картинке

Функция «картинка в картинке» (PIP) для мобильных устройств Android позволяет пользователям изменять размер окна приложения, в котором выполняется текущая активность, до небольшого размера. Функция PIP особенно полезна для видеоприложений, поскольку воспроизведение контента продолжается, пока пользователь может выполнять другие действия. Пользователи могут управлять положением этого окна через SystemUI и взаимодействовать с приложением, находящимся в режиме «картинка в картинке», используя (до трёх) действий, предоставляемых приложением.

PIP requires explicit opt-in from applications that support it and works on a per-activity basis. (A single application can have multiple activities, only one of which is in PIP.) Activities request to enter picture-in-picture by calling enterPictureInPictureMode() , and receive activity callbacks in the form of onPictureInPictureModeChanged() .

The setPictureInPictureParams() method lets activities control their aspect ratio while in PIP and custom actions, which allow users to interact with the activity without having to expand it. In PIP, the activity is in a paused, but rendering, state and doesn't directly receive touch input or window focus. Only a single task can be in PIP at a time.

Более подробную информацию можно найти в документации Android Developer по технологии «картинка в картинке» .

Требования к устройству

Для поддержки режима «картинка в картинке» включите системную функцию PackageManager#FEATURE_PICTURE_IN_PICTURE в /android/frameworks/base/core/java/android/content/pm/PackageManager.java . Устройства с поддержкой режима «картинка в картинке» должны иметь экран с разрешением более 220 dp в минимальной ширине. Подобно раздельному экрану с несколькими окнами, режим «картинка в картинке» позволяет одновременно выполнять несколько действий на экране. Поэтому устройства должны иметь достаточный объем процессора и оперативной памяти для поддержки этого варианта использования.

Выполнение

Большая часть управления жизненным циклом активности осуществляется в системе между ActivityManager и WindowManager . Реализация эталонного пользовательского интерфейса находится в пакете SystemUI .

Modifications to the system should not affect its intrinsic behavior as defined by the Compatibility Test Suite (CTS) tests . The system logic for PIP mainly revolves around the management of tasks and activities within the "pinned" stack. Here is a quick class overview:

  • ActivityRecord : tracks each activity's picture-in-picture state. To prevent users from entering PIP in certain circumstances, such as from the lock screen or during VR, add cases to checkEnterPictureInPictureState() .
  • ActivityManagerService : основной интерфейс активности для запроса входа в PIP и интерфейс для вызовов из WindowManager и SystemUI для изменения состояния активности PIP.
  • ActivityStackSupervisor : вызывается из ActivityManagerService для перемещения задач в закрепленный стек или из него, обновляя WindowManager по мере необходимости.
  • PinnedStackWindowController : интерфейс WindowManager из ActivityManager .
  • PinnedStackController : сообщает об изменениях в системе в SystemUI , таких как отображение/скрытие IME, изменение соотношения сторон или изменение действий.
  • BoundsAnimationController : анимирует окна активности PIP таким образом, чтобы не вызывать изменение конфигурации при изменении размера.
  • PipSnapAlgorithm : общий класс, используемый как в системе, так и в SystemUI, который управляет поведением привязки окна PIP к краям экрана.

The reference SystemUI provides a complete implementation of PIP that supports presenting custom actions to users and general manipulation, such as expansion and dismissal. Device manufacturers can build upon these changes, as long as they do not affect the intrinsic behaviours as defined by the CDD. Here is a quick class overview:

  • PipManager : компонент SystemUI , который запускается вместе с SystemUI .
  • PipTouchHandler : the touch handler, which controls the gestures that manipulate the PIP. This is only used while the input consumer for the PIP is active (see InputConsumerController ). New gestures can be added here.
  • PipMotionHelper : a convenience class that tracks the PIP position, and allowable region on-screen. Calls through to ActivityManagerService to update or animate the position and size of the PIP.
  • PipMenuActivityController : starts an activity that shows the actions provided by the activity currently in PIP. This activity is a task-overlay activity, and removes the overlaying input consumer to allow it to be interactive.
  • PipMenuActivity : реализация действия меню.
  • PipMediaController : прослушиватель, который обновляет SystemUI при изменении сеанса мультимедиа таким образом, что это может повлиять на действия по умолчанию в PIP.
  • PipNotificationController : контроллер, который обеспечивает активность уведомления, пока пользователь использует функцию PIP.
  • PipDismissViewController : наложение, показываемое пользователям, когда они начинают взаимодействовать с PIP, чтобы указать, что его можно закрыть.

Размещение по умолчанию

Существуют различные системные ресурсы, которые управляют размещением PIP по умолчанию:

  • config_defaultPictureInPictureGravity : целое число гравитации , которое управляет углом размещения PIP, например BOTTOM|RIGHT .
  • config_defaultPictureInPictureScreenEdgeInsets : смещения от краев экрана для размещения PIP.
  • config_pictureInPictureDefaultSizePercent and config_pictureInPictureDefaultAspectRatio : the combination of percentage of the screen width and the aspect ratio controls the size of the PIP. The computed default PIP size should not be smaller than @dimen/default_minimal_size_pip_resizable_task , as defined by CTS and the CDD.
  • config_pictureInPictureSnapMode : поведение привязки, определенное в PipSnapAlgorithm .

Реализации устройств не должны изменять минимальные и максимальные соотношения сторон, определенные в CDD и CTS.

Разрешения

The per-package "application operation" ( OP_PICTURE_IN_PICTURE ) in AppOpsManager ( main/core/java/android/app/AppOpsManager.java ), lets users to control PIP on a per-application level through the system settings. Device implementations need to respect this check when an activity requests to enter picture-in-picture mode.

Тестирование

To test PIP implementations, run all picture-in-picture related tests found in the host-side CTS tests under /cts/hostsidetests/services/activitymanager , particularly in ActivityManagerPinnedStackTests.java .