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