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

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

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

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

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

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

หากต้องการรองรับ PIP ให้เปิดใช้PackageManager#FEATURE_PICTURE_IN_PICTUREฟีเจอร์ระบบใน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: ตัวรับฟังที่อัปเดต 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