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