Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Hình ảnh trong ả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 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ể 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 đang ở 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 duy nhất có thể có nhiều hoạt động, chỉ một trong số đó nằm trong PIP.) Các hoạt động yêu cầu nhập ảnh trong ảnh bằng cách gọi enterPictureInPictureMode() và nhận lệnh gọi lại hoạt động dưới dạng onPictureInPictureModeChanged() .

Phương setPictureInPictureParams() cho phép các hoạt động kiểm soát tỷ lệ khung hình của chúng khi ở trong 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 nó. 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 chạm hoặc tiêu điểm cửa sổ. Mỗi lần chỉ có thể thực hiện một nhiệm vụ duy nhất trong PIP.

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

Yêu cầu 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 . 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 của nó. Tương tự như đa cửa sổ chia đôi màn hình, 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ị nê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 không được ảnh hưởng đến hành vi nội tại của nó như được xác định bởi các bài kiểm tra của Bộ thử nghiệm 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 "được ghim". Đây là tổng quan nhanh về lớp học:

  • ActivityRecord : theo dõi trạng thái ảnh trong ả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 thời gian thực tế ảo, hãy thêm các trường hợp để 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 khi cần thiết.
  • PinnedStackWindowController : giao diện WindowManager từ ActivityManager .
  • PinnedStackController : báo cáo các thay đổi trong hệ thống đối với SystemUI , chẳng hạn như IME hiển thị / ẩn, thay đổi tỷ lệ khung hình 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 chia sẻ được sử dụng trong cả hệ thống và SystemUI điều khiển hành vi chụp nhanh của cửa sổ PIP gần các cạnh của màn hình.

Tham chiếu SystemUI cung cấp một triển khai hoàn chỉnh của PIP 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 các hành vi nội tại như được định nghĩa bởi CDD. Đây là tổng quan nhanh về lớp học:

  • PipManager : thành phần SystemUI được khởi động với SystemUI .
  • PipTouchHandler : trình xử lý cảm ứng, điều khiển các cử chỉ điều khiển PIP. Điều này chỉ được sử dụng khi người tiêu dùng đầu vào cho PIP đang hoạt động (xem InputConsumerController ). Các 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 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 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à một 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 : triển khai hoạt động menu.
  • PipMediaController : trình lắng 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 đang hoạt động trong khi người dùng đang sử dụng tính năng PIP.
  • PipDismissViewController : lớp phủ được 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 : khoảng lệch từ các cạnh của màn hình để đặt PIP.
  • config_pictureInPictureDefaultSizePercentconfig_pictureInPictureDefaultAspectRatio : kết hợp 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 định nghĩa bởi CTS và CDD.
  • config_pictureInPictureSnapMode : hành vi snapping như được định nghĩa 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 ( master/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 tuân thủ việc kiểm tra này khi một hoạt động yêu cầu chuyển sang chế độ ảnh trong ảnh.

Thử nghiệm

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