Google is committed to advancing racial equity for Black communities. See how.
Эта страница была переведа с помощью Cloud Translation API.
Switch to English

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

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

PIP требует явного согласия со стороны приложений, которые его поддерживают, и работает на основе активности. (Одно приложение может иметь несколько действий, только одно из которых находится в режиме PIP.) Действия запрашивают ввод «картинка в картинке», вызывая enterPictureInPictureMode() , и получают обратные вызовы активности в форме onPictureInPictureModeChanged() .

Метод setPictureInPictureParams() позволяет действиям управлять своим соотношением сторон в режиме PIP и настраивать действия, которые позволяют пользователям взаимодействовать с действием, не расширяя его. В PIP действие приостановлено, но рендеринг, состояние и не получает напрямую сенсорный ввод или фокус окна. Только одна задача может быть в PIP одновременно.

Дополнительную информацию можно найти в документации для разработчиков Android " Картинка в картинке" .

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

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

Реализация

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

Модификации системы не должны влиять на ее внутреннее поведение, как определено тестами Compatibility Test Suite (CTS) . Системная логика для PIP в основном вращается вокруг управления задачами и действиями в «закрепленном» стеке. Вот краткий обзор класса:

  • ActivityRecord : отслеживает состояние картинки в картинке каждого действия. Чтобы запретить пользователям вводить PIP в определенных обстоятельствах, например, с экрана блокировки или во время VR, добавьте случаи в 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 : комбинация процента ширины экрана и соотношения сторон определяет размер config_pictureInPictureDefaultAspectRatio в картинке. Вычисленный размер 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 .