Hình trong hình

Tính năng ảnh trong ảnh (PIP) dành cho thiết bị cầm tay Android cho phép người dùng thay đổi kích thước ứng dụng đang hoạt động vào một cửa sổ nhỏ. PIP đặc biệt hữu ích cho các ứng dụng video vì nội dung tiếp tục phát trong khi người dùng có thể tự do thực hiện các hành động khác. Người dùng có thể thao tác vị trí của cửa sổ này thông qua SystemUI và tương tác với ứng dụng hiện ở chế độ hình trong ảnh bằng (tối đa ba) hành động do ứng dụng cung cấp.

PIP yêu cầu chọn tham gia rõ ràng từ các ứng dụng hỗ trợ nó và hoạt động trên cơ sở từng hoạt động. (Một ứng dụng có thể có nhiều hoạt động, chỉ một hoạt động trong số đó ở dạng PIP.) Các hoạt động yêu cầu nhập hình trong ảnh bằng cách gọi enterPictureInPictureMode() và nhận các lệnh gọi lại hoạt động dưới dạng onPictureInPictureModeChanged() .

Phương thức setPictureInPictureParams() cho phép các hoạt động kiểm soát tỷ lệ khung hình của chúng trong khi ở chế độ PIP và các hành động tùy chỉnh, cho phép người dùng tương tác với hoạt động mà không cần phải mở rộng hoạt động đó. Trong PIP, hoạt động ở trạng thái tạm dừng nhưng hiển thị và không trực tiếp nhận đầu vào cảm ứng hoặc tiêu điểm cửa sổ. Mỗi lần chỉ có một tác vụ duy nhất có thể ở PIP.

Thông tin thêm có sẵn trong tài liệu Ảnh trong ảnh dành cho nhà phát triển Android.

Yêu cầu về thiết bị

Để hỗ trợ PIP, hãy bật tính năng hệ thống PackageManager#FEATURE_PICTURE_IN_PICTURE trong /android/frameworks/base/core/java/android/content/pm/PackageManager.java . Các thiết bị hỗ trợ PIP phải có màn hình lớn hơn 220dp ở chiều rộng nhỏ nhất. Tương tự như chia đôi màn hình nhiều cửa sổ, PIP cho phép nhiều hoạt động chạy trên màn hình cùng một lúc. Do đó, các thiết bị cần có đủ CPU và RAM để hỗ trợ trường hợp sử dụng này.

Thực hiện

Hầu hết việc quản lý vòng đời hoạt động được thực hiện trong hệ thống giữa ActivityManagerWindowManager . Việc triển khai giao diện người dùng tham chiếu nằm trong gói SystemUI .

Các sửa đổi đối với hệ thống sẽ không ảnh hưởng đến hành vi nội tại của nó như được xác định bởi các thử nghiệm Bộ kiểm tra khả năng tương thích (CTS) . Logic hệ thống cho PIP chủ yếu xoay quanh việc quản lý các nhiệm vụ và hoạt động trong ngăn xếp được "ghim". Dưới đây là tổng quan nhanh về lớp học:

  • ActivityRecord : theo dõi trạng thái hình trong hình của từng hoạt động. Để ngăn người dùng nhập PIP trong một số trường hợp nhất định, chẳng hạn như từ màn hình khóa hoặc trong VR, hãy thêm trường hợp vào checkEnterPictureInPictureState() .
  • ActivityManagerService : giao diện chính từ hoạt động yêu cầu nhập PIP và giao diện cho các cuộc gọi từ WindowManagerSystemUI để thay đổi trạng thái hoạt động PIP.
  • ActivityStackSupervisor : được gọi từ ActivityManagerService để di chuyển các tác vụ vào hoặc ra khỏi ngăn xếp được ghim, cập nhật WindowManager nếu cần.
  • PinnedStackWindowController : giao diện WindowManager từ ActivityManager .
  • PinnedStackController : báo cáo các thay đổi trong hệ thống tới SystemUI , chẳng hạn như IME được hiển thị/ẩn, tỷ lệ khung hình đã thay đổi hoặc các hành động đã thay đổi.
  • BoundsAnimationController : tạo hoạt ảnh cho các cửa sổ hoạt động PIP theo cách không kích hoạt thay đổi cấu hình trong khi thay đổi kích thước.
  • PipSnapAlgorithm : một lớp dùng chung được sử dụng trong cả hệ thống và SystemUI để kiểm soát hành vi chụp nhanh của cửa sổ PIP gần các cạnh của màn hình.

SystemUI tham chiếu cung cấp triển khai PIP hoàn chỉnh hỗ trợ trình bày các hành động tùy chỉnh cho người dùng và thao tác chung, chẳng hạn như mở rộng và loại bỏ. Các nhà sản xuất thiết bị có thể xây dựng dựa trên những thay đổi này, miễn là chúng không ảnh hưởng đến hành vi nội tại như được CDD xác định. Dưới đây là tổng quan nhanh về lớp học:

  • PipManager : thành phần SystemUI được khởi động bằng SystemUI .
  • PipTouchHandler : trình xử lý cảm ứng, điều khiển các cử chỉ thao tác PIP. Điều này chỉ được sử dụng khi trình tiêu thụ đầu vào cho PIP đang hoạt động (xem InputConsumerController ). Cử chỉ mới có thể được thêm vào đây.
  • PipMotionHelper : một lớp tiện lợi theo dõi vị trí PIP và vùng được phép trên màn hình. Gọi tới ActivityManagerService để cập nhật hoặc tạo hoạt ảnh cho vị trí và kích thước của PIP.
  • PipMenuActivityController : bắt đầu một hoạt động hiển thị các hành động được cung cấp bởi hoạt động hiện có trong PIP. Hoạt động này là hoạt động lớp phủ nhiệm vụ và loại bỏ người tiêu dùng đầu vào lớp phủ để cho phép nó tương tác.
  • PipMenuActivity : việc triển khai hoạt động menu.
  • PipMediaController : trình nghe cập nhật SystemUI khi phiên phương tiện thay đổi theo cách có thể ảnh hưởng đến các hành động mặc định trên PIP.
  • PipNotificationController : bộ điều khiển đảm bảo rằng thông báo được kích hoạt trong khi người dùng đang sử dụng tính năng PIP.
  • PipDismissViewController : lớp phủ hiển thị cho người dùng khi họ bắt đầu tương tác với PIP để cho biết rằng nó có thể bị loại bỏ.

Vị trí mặc định

Có nhiều tài nguyên hệ thống khác nhau kiểm soát vị trí mặc định của PIP:

  • config_defaultPictureInPictureGravity : số nguyên trọng lực , điều khiển góc để đặt PIP, chẳng hạn như BOTTOM|RIGHT .
  • config_defaultPictureInPictureScreenEdgeInsets : phần bù từ các cạnh của màn hình để đặt PIP.
  • config_pictureInPictureDefaultSizePercentconfig_pictureInPictureDefaultAspectRatio : sự kết hợp giữa phần trăm chiều rộng màn hình và tỷ lệ khung hình kiểm soát kích thước của PIP. Kích thước PIP mặc định được tính toán không được nhỏ hơn @dimen/default_minimal_size_pip_resizable_task , như được xác định bởi CTS và CDD.
  • config_pictureInPictureSnapMode : hành vi chụp nhanh như được xác định trong PipSnapAlgorithm .

Việc triển khai thiết bị không được thay đổi tỷ lệ khung hình tối thiểu và tối đa được xác định trong CDD và CTS.

Quyền

"Hoạt động ứng dụng" trên mỗi gói ( OP_PICTURE_IN_PICTURE ) trong AppOpsManager ( main/core/java/android/app/AppOpsManager.java ), cho phép người dùng kiểm soát PIP ở cấp độ mỗi ứng dụng thông qua cài đặt hệ thống. Việc triển khai thiết bị cần phải tôn trọng bước kiểm tra này khi một hoạt động yêu cầu chuyển sang chế độ ảnh trong ảnh.

Kiểm tra

Để kiểm tra việc triển khai PIP, hãy chạy tất cả các kiểm tra liên quan đến ảnh trong ảnh được tìm thấy trong các kiểm tra CTS phía máy chủ trong /cts/hostsidetests/services/activitymanager , đặc biệt là trong ActivityManagerPinnedStackTests.java .