ฟีเจอร์ภาพซ้อนภาพ (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จากActivityManagerPinnedStackController: รายงานการเปลี่ยนแปลงในระบบ ไปยังSystemUIเช่น IME แสดง/ซ่อน เปลี่ยนสัดส่วนภาพ หรือเปลี่ยนการดำเนินการBoundsAnimationController: เคลื่อนไหวหน้าต่างกิจกรรม PIP ในลักษณะที่ไม่ทริกเกอร์การเปลี่ยนแปลงการกำหนดค่าขณะ ปรับขนาดPipSnapAlgorithm: คลาสที่แชร์ซึ่งใช้ในทั้ง ระบบและ SystemUI ที่ควบคุมลักษณะการตรึงของหน้าต่าง PIP ใกล้ขอบของหน้าจอ
ข้อมูลอ้างอิงSystemUI
จะแสดงการติดตั้งใช้งาน PIP ทั้งหมดที่รองรับการแสดงการดำเนินการที่กำหนดเอง
ต่อผู้ใช้และการจัดการทั่วไป เช่น การขยายและการปิด
ผู้ผลิตอุปกรณ์สามารถต่อยอดการเปลี่ยนแปลงเหล่านี้ได้ ตราบใดที่การเปลี่ยนแปลงนั้นไม่ส่งผลต่อ
ลักษณะการทำงานโดยธรรมชาติตามที่กำหนดไว้ใน CDD ภาพรวมคลาสโดยย่อมีดังนี้
PipManager: คอมโพเนนต์SystemUIที่เริ่มต้นด้วยSystemUIPipTouchHandler: ตัวแฮนเดิลการสัมผัส ซึ่ง ควบคุมท่าทางสัมผัสที่จัดการ PIP โดยจะใช้เฉพาะในขณะที่อินพุต สำหรับ PIP ทำงานอยู่ (ดูInputConsumerController) และเพิ่มท่าทางสัมผัสใหม่ ได้ที่นี่PipMotionHelper: คลาสอำนวยความสะดวกที่ ติดตามตำแหน่ง PIP และภูมิภาคที่อนุญาตบนหน้าจอ โทรผ่านไปยังActivityManagerServiceเพื่ออัปเดตหรือทำให้ตำแหน่งและขนาด ของ PIP เคลื่อนไหวPipMenuActivityController: เริ่มกิจกรรม ที่แสดงการดำเนินการที่กิจกรรมซึ่งอยู่ในโหมด PIP อยู่ในปัจจุบันมีให้ กิจกรรมนี้ เป็นกิจกรรมการวางซ้อนงาน และนำเครื่องมือรับอินพุตที่วางซ้อนออกเพื่อให้ โต้ตอบได้PipMenuActivity: การใช้งานสำหรับกิจกรรมเมนูPipMediaController: ตัวรับฟังที่อัปเดตSystemUIเมื่อเซสชันสื่อมีการเปลี่ยนแปลงในลักษณะที่อาจส่งผลต่อ การดำเนินการเริ่มต้นใน PIPPipNotificationController: ตัวควบคุมที่ ตรวจสอบว่าการแจ้งเตือนทำงานอยู่ขณะที่ผู้ใช้ใช้ฟีเจอร์ PIPPipDismissViewController: การวางซ้อนที่แสดงต่อผู้ใช้เมื่อเริ่มโต้ตอบกับ PIP เพื่อระบุว่าสามารถปิดได้
ตําแหน่งเริ่มต้น
มีทรัพยากรของระบบต่างๆ ที่ควบคุมตำแหน่งเริ่มต้นของ PIP ดังนี้
config_defaultPictureInPictureGravity: จำนวนเต็ม gravity ซึ่งควบคุมมุมที่จะวาง PIP เช่นBOTTOM|RIGHTconfig_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