การแสดงภาพซ้อนภาพ

คุณลักษณะภาพซ้อนภาพ (PIP) สำหรับอุปกรณ์มือถือ Android ช่วยให้ผู้ใช้ปรับขนาดแอปที่มีกิจกรรมต่อเนื่องเป็นหน้าต่างเล็กๆ ได้ PIP มีประโยชน์อย่างยิ่งสำหรับแอปวิดีโอเนื่องจากเนื้อหายังคงเล่นต่อไปในขณะที่ผู้ใช้มีอิสระที่จะดำเนินการอื่นๆ ผู้ใช้สามารถจัดการตำแหน่งของหน้าต่างนี้ผ่าน SystemUI และโต้ตอบกับแอปพลิเคชันปัจจุบันในรูปแบบภาพซ้อนภาพด้วยการดำเนินการที่แอปกำหนด (สูงสุดสาม)

PIP กำหนดให้ต้องเลือกใช้อย่างชัดเจนจากแอปพลิเคชันที่รองรับและทำงานตามแต่ละกิจกรรม (แอปพลิเคชันเดียวสามารถมีกิจกรรมได้หลายอย่าง โดยกิจกรรมเดียวเท่านั้นที่อยู่ใน PIP) กิจกรรมร้องขอให้เข้าสู่การแสดงภาพซ้อนภาพโดยการเรียก enterPictureInPictureMode() และรับการเรียกกลับกิจกรรมในรูปแบบของ onPictureInPictureModeChanged()

เมธอด setPictureInPictureParams() ช่วยให้กิจกรรมควบคุมอัตราส่วนภาพของตนได้ในขณะที่อยู่ใน PIP และการดำเนินการแบบกำหนดเอง ซึ่งช่วยให้ผู้ใช้สามารถโต้ตอบกับกิจกรรมได้โดยไม่ต้องขยาย ใน PIP กิจกรรมอยู่ในสถานะหยุดชั่วคราว แต่กำลังเรนเดอร์ สถานะและไม่ได้รับอินพุตแบบสัมผัสหรือโฟกัสหน้าต่างโดยตรง สามารถอยู่ใน PIP ได้ครั้งละงานเท่านั้น

ข้อมูลเพิ่มเติมมีอยู่ในเอกสาร ประกอบภาพซ้อนภาพ สำหรับนักพัฒนาซอฟต์แวร์ Android

ข้อกำหนดของอุปกรณ์

หากต้องการสนับสนุน PIP ให้เปิดใช้งานคุณลักษณะระบบ PackageManager#FEATURE_PICTURE_IN_PICTURE ใน /android/frameworks/base/core/java/android/content/pm/PackageManager.java อุปกรณ์ที่รองรับ PIP ต้องมีหน้าจอที่มีขนาดใหญ่กว่า 220dp โดยมีความกว้างน้อยที่สุด คล้ายกับการแบ่งหน้าจอหลายหน้าต่าง PIP อนุญาตให้หลายกิจกรรมทำงานบนหน้าจอในเวลาเดียวกัน ดังนั้นอุปกรณ์ควรมี CPU และ RAM เพียงพอเพื่อรองรับกรณีการใช้งานนี้

การนำไปปฏิบัติ

การจัดการวงจรชีวิตของกิจกรรมส่วนใหญ่ทำในระบบระหว่าง ActivityManager และ WindowManager การใช้งาน UI อ้างอิงอยู่ในแพ็คเกจ SystemUI

การปรับเปลี่ยนระบบไม่ควรส่งผลกระทบต่อพฤติกรรมภายในตามที่กำหนดโดย การทดสอบความเข้ากันได้ของชุดทดสอบ (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 : Listener ที่อัปเดต SystemUI เมื่อเซสชันสื่อเปลี่ยนแปลงในลักษณะที่อาจส่งผลต่อการดำเนินการเริ่มต้นบน PIP
  • PipNotificationController : ตัวควบคุมที่ทำให้แน่ใจว่าการแจ้งเตือนจะทำงานในขณะที่ผู้ใช้ใช้คุณสมบัติ PIP
  • PipDismissViewController : ภาพซ้อนทับที่แสดงต่อผู้ใช้เมื่อพวกเขาเริ่มโต้ตอบกับ PIP เพื่อระบุว่าสามารถปิดได้

ตำแหน่งเริ่มต้น

มีทรัพยากรระบบต่างๆ ที่ควบคุมตำแหน่งเริ่มต้นของ PIP:

  • config_defaultPictureInPictureGravity : จำนวนเต็ม แรงโน้มถ่วง ซึ่งควบคุมมุมเพื่อวาง PIP เช่น BOTTOM|RIGHT
  • config_defaultPictureInPictureScreenEdgeInsets : ออฟเซ็ตจากด้านข้างของหน้าจอเพื่อวาง PIP
  • config_pictureInPictureDefaultSizePercent และ config_pictureInPictureDefaultAspectRatio : การรวมกันของเปอร์เซ็นต์ของความกว้างหน้าจอและอัตราส่วนภาพจะควบคุมขนาดของ PIP ขนาด PIP เริ่มต้นที่คำนวณแล้วไม่ควรเล็กกว่า @dimen/default_minimal_size_pip_resizable_task ตามที่กำหนดโดย CTS และ CDD
  • config_pictureInPictureSnapMode : ลักษณะการสแนปตามที่กำหนดใน PipSnapAlgorithm

การใช้งานอุปกรณ์ไม่ควรเปลี่ยนอัตราส่วนภาพขั้นต่ำและสูงสุดที่กำหนดไว้ใน CDD และ CTS

สิทธิ์

"การดำเนินการแอปพลิเคชัน" ต่อแพ็คเกจ ( OP_PICTURE_IN_PICTURE ) ใน AppOpsManager ( main/core/java/android/app/AppOpsManager.java ) ช่วยให้ผู้ใช้สามารถควบคุม PIP ในระดับต่อแอปพลิเคชันผ่านการตั้งค่าระบบ การใช้งานอุปกรณ์ต้องปฏิบัติตามการตรวจสอบนี้เมื่อมีกิจกรรมร้องขอให้เข้าสู่โหมดการแสดงภาพซ้อนภาพ

การทดสอบ

หากต้องการทดสอบการใช้งาน PIP ให้รันการทดสอบที่เกี่ยวข้องกับรูปภาพซ้อนภาพทั้งหมดที่พบในการทดสอบ CTS ฝั่งโฮสต์ภายใต้ /cts/hostsidetests/services/activitymanager โดยเฉพาะใน ActivityManagerPinnedStackTests.java