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

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

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

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

ดูข้อมูลเพิ่มเติมได้ในเอกสารประกอบภาพในภาพสำหรับนักพัฒนาแอป Android

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

หากต้องการรองรับ PIP ให้เปิดใช้ฟีเจอร์ระบบ PackageManager#FEATURE_PICTURE_IN_PICTURE ใน /android/frameworks/base/core/java/android/content/pm/PackageManager.java อุปกรณ์ที่รองรับ PIP ต้องมีหน้าจอที่กว้างกว่า 220 DP ในส่วนความกว้างที่แคบที่สุด 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: ตัวแฟังที่จะอัปเดต SystemUI เมื่อเซสชันสื่อมีการเปลี่ยนแปลงในลักษณะที่อาจส่งผลต่อการดำเนินการเริ่มต้นใน PIP
  • PipNotificationController: ตัวควบคุมที่ตรวจสอบว่าการแจ้งเตือนทำงานอยู่ขณะที่ผู้ใช้ใช้ฟีเจอร์ PIP
  • PipDismissViewController: การซ้อนทับที่แสดงต่อผู้ใช้เมื่อเริ่มโต้ตอบกับ PIP เพื่อระบุว่าสามารถปิดได้

ตําแหน่งเริ่มต้น

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

  • config_defaultPictureInPictureGravity: gravity จำนวนเต็ม ซึ่งควบคุมมุมที่จะวาง 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