ฟีเจอร์ภาพซ้อนภาพ (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
เพื่อเปลี่ยนสถานะกิจกรรม 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