ฟีเจอร์ภาพซ้อนภาพ (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
เพื่อเปลี่ยนสถานะกิจกรรม PIPActivityStackSupervisor
: เรียกใช้จาก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
เมื่อเซสชันสื่อมีการเปลี่ยนแปลงในลักษณะที่อาจส่งผลต่อการดำเนินการเริ่มต้นใน PIPPipNotificationController
: ตัวควบคุมที่ตรวจสอบว่าการแจ้งเตือนทำงานอยู่ขณะที่ผู้ใช้ใช้ฟีเจอร์ PIPPipDismissViewController
: การซ้อนทับที่แสดงต่อผู้ใช้เมื่อเริ่มโต้ตอบกับ PIP เพื่อระบุว่าสามารถปิดได้
ตําแหน่งเริ่มต้น
ทรัพยากรระบบต่างๆ ที่ควบคุมตำแหน่งเริ่มต้นของ PIP มีดังนี้
config_defaultPictureInPictureGravity
: gravity จำนวนเต็ม ซึ่งควบคุมมุมที่จะวาง PIP เช่นBOTTOM|RIGHT
config_defaultPictureInPictureScreenEdgeInsets
: การเลื่อนจากด้านข้างของหน้าจอเพื่อวาง PIPconfig_pictureInPictureDefaultSizePercent
และconfig_pictureInPictureDefaultAspectRatio
: การรวมเปอร์เซ็นต์ของความกว้างของหน้าจอและสัดส่วนภาพจะควบคุมขนาดของ PIP ขนาด PIP เริ่มต้นที่คำนวณแล้วต้องไม่เล็กกว่า@dimen/default_minimal_size_pip_resizable_task
ตามที่กำหนดโดย CTS และ CDDconfig_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