Hình trong hình

Tính năng hình trong hình (PIP) dành cho thiết bị cầm tay Android cho phép người dùng đổi kích thước ứng dụng có hoạt động đang diễn ra thành 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ể điều khiển 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 đang ở chế độ hình trong hình bằng (tối đa 3) hành động do ứng dụng cung cấp.

PIP yêu cầu các ứng dụng hỗ trợ tính năng này phải chọn sử dụng một cách rõ ràng 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 trong số đó ở chế độ PIP.) Các hoạt động yêu cầu chuyển sang chế độ hình trong hình bằng cách gọi enterPictureInPictureMode() và nhận lệnh gọi lại hoạt động ở 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 khi ở chế độ PIP và các hành động tuỳ chỉnh, cho phép người dùng tương tác với hoạt động mà không cần mở rộng hoạt động đó. Ở chế độ PIP, hoạt động ở trạng thái tạm dừng nhưng đang kết xuất và không trực tiếp nhận dữ liệu đầu vào cảm ứng hoặc tiêu điểm cửa sổ. Chỉ một tác vụ có thể ở chế độ PIP tại một thời điểm.

Bạn có thể xem thêm thông tin trong tài liệu Hình trong hì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 220 dp ở chiều rộng nhỏ nhất. Tương tự như chế độ nhiều cửa sổ chia đôi màn hình, PIP cho phép nhiều hoạt động chạy đồng thời trên màn hình. Do đó, thiết bị phải có đủ CPU và RAM để hỗ trợ trường hợp sử dụng này.

Triển khai

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

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

  • 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 chuyển sang chế độ PIP trong một số trường hợp nhất định, chẳng hạn như từ màn hình khoá hoặc trong VR, hãy thêm các trường hợp vào checkEnterPictureInPictureState().
  • ActivityManagerService: giao diện chính từ hoạt động để yêu cầu chuyển sang chế độ PIP và giao diện để gọi từ WindowManagerSystemUI nhằm 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 đã ghim, cập nhật WindowManager khi cần.
  • PinnedStackWindowController: giao diện WindowManager từ ActivityManager.
  • PinnedStackController: báo cáo các thay đổi trong hệ thống cho SystemUI, chẳng hạn như IME hiển thị/ẩn, tỷ lệ khung hình thay đổi hoặc các hành động thay đổi.
  • BoundsAnimationController: tạo hiệu ứng động 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 đổ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 bám dính của cửa sổ PIP gần các cạnh của màn hình.

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

  • PipManager: thành phần SystemUI được khởi động bằng SystemUI.
  • PipTouchHandler: trình xử lý cảm ứng, kiểm soát các cử chỉ thao tác với PIP. Trình xử lý này chỉ được sử dụng khi trình tiêu thụ đầu vào cho PIP đang hoạt động (xem InputConsumerController). Bạn có thể thêm các cử chỉ mới tại đây.
  • PipMotionHelper: một lớp tiện lợi theo dõi vị trí PIP và vùng cho phép trên màn hình. Gọi thông qua ActivityManagerService để cập nhật hoặc tạo hiệu ứng động cho vị trí và kích thước của PIP.
  • PipMenuActivityController: khởi động một hoạt động hiển thị các hành động do hoạt động hiện đang ở chế độ PIP cung cấp. Hoạt động này là hoạt động lớp phủ tác vụ và loại bỏ trình tiêu thụ đầu vào lớp phủ để cho phép hoạt động này tương tác.
  • PipMenuActivity: cách triển khai cho hoạt động trình đơn.
  • PipMediaController: trình nghe cập nhật SystemUI khi phiên đa 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: trình điều khiển đảm bảo rằng một thông báo đang hoạt động 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 họ có thể đóng lớp phủ này.

Vị trí mặc định

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

  • config_defaultPictureInPictureGravity: số nguyên trọng lực kiểm soát góc để đặt PIP, chẳng hạn như BOTTOM|RIGHT.
  • config_defaultPictureInPictureScreenEdgeInsets: các độ lệch từ các cạnh của màn hình để đặt PIP.
  • config_pictureInPictureDefaultSizePercentconfig_pictureInPictureDefaultAspectRatio: sự kết hợp giữa tỷ lệ 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 bám dính như được xác định trong PipSnapAlgorithm.

Cách 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

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

Thử nghiệm

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