พื้นที่ย่อยคือพาร์ติชันของพื้นที่ 3 มิติภายในแอปที่คุณสามารถวางโมเดล 3 มิติ สร้างเลย์เอาต์ 3 มิติ และเพิ่มความลึกให้กับเนื้อหา 2 มิติ พื้นที่ย่อยจะแสดงผลเมื่อเปิดใช้การสร้างเสียง 3 มิติเท่านั้น ใน Home Space หรือในอุปกรณ์ที่ไม่ใช่ XR ระบบจะละเว้นโค้ดใดๆ ภายในพื้นที่ย่อยนั้น
คุณสามารถใช้ Composable ของพื้นที่ย่อย เช่น SpatialPanel, SpatialRow,
และ SpatialColumn เพื่อสร้างเลย์เอาต์และวางเนื้อหา 2 มิติในพื้นที่ 3 มิติ
หากต้องการวางเนื้อหา 3 มิติ ให้ใช้ Subspace Composable ที่เหมาะสม เช่น
SceneCoreEntity สำหรับโมเดล 3 มิติ และ SpatialExternalSurface สำหรับ
รูปภาพสเตอริโอ คอมโพเนนต์ XR บางอย่าง เช่น Orbiter หรือ SpatialDialog
เป็น Composable 2 มิติมาตรฐานที่ใช้ได้ทุกที่ในลำดับชั้น UI 2 มิติ
แต่ต้องเรียกใช้ SubspaceComposable ในพื้นที่ย่อยของแอป หากต้องการทำ
เช่นนี้ ให้ใช้ Composable ของพื้นที่ย่อย Subspace
เกี่ยวกับลำดับชั้นของพื้นที่ย่อย
Subspace ระดับบนสุดคือพื้นที่ย่อยด้านนอกสุดที่แอปเรียกใช้
การเรียกใช้ Subspace แต่ละครั้งจะสร้างลำดับชั้น UI เชิงพื้นที่ใหม่ที่เป็นอิสระ
โดยจะไม่รับช่วงตำแหน่งเชิงพื้นที่ การวางแนว หรือการปรับขนาดของ Subspace ระดับบนสุดที่ซ้อนอยู่
หากต้องการสร้าง Subspace ที่ฝังหรือซ้อนอยู่ภายใน SpatialPanel, Orbiter,
SpatialPopup หรือคอมโพเนนต์อื่นๆ ให้ใช้ PlanarEmbeddedSubspace
PlanarEmbeddedSubspace มีความแตกต่างที่สำคัญ 2 ประการจาก Subspace ดังนี้
- มีส่วนร่วมในเลย์เอาต์ 2 มิติที่เรียกใช้ ซึ่งหมายความว่าความสูงและความกว้างของพื้นที่ย่อยจะถูกจำกัดด้วยความสูงและความกว้างของเลย์เอาต์หลัก 2 มิติ
- ทำงานเป็นองค์ประกอบย่อยของเอนทิตีที่เรียกใช้ ซึ่งหมายความว่า
หากคุณเรียกใช้ Composable ของพื้นที่ย่อยที่ซ้อนอยู่ภายใน
SpatialPanelพื้นที่ย่อยนั้นจะเป็นองค์ประกอบย่อยของSpatialPanelที่เรียกใช้
ลักษณะการทำงานของ PlanarEmbeddedSubspace ช่วยให้สามารถทำสิ่งต่างๆ ได้ เช่น
- ย้ายองค์ประกอบย่อยไปพร้อมกับเอนทิตีหลัก
- ชดเชยตำแหน่งขององค์ประกอบย่อยโดยใช้ที่ชดเชย
SubspaceModifier - แสดงออบเจ็กต์ 3 มิติที่ลอยอยู่เหนือ UI 2 มิติและมีความสูงและความกว้างเท่ากับพื้นที่ที่เหมาะสมในเลย์เอาต์ 2 มิติ
ปรับเลย์เอาต์สำหรับพื้นที่ย่อย
ใน Android XR เลย์เอาต์ของแอปจะผูกกับ VolumeConstraints ของ
Subspace ในโหมด Full Space โดยค่าเริ่มต้น ด้วยเหตุนี้ คุณจึงควรพิจารณาพื้นที่ที่มองเห็นได้ซึ่งผู้ใช้สามารถใช้ได้และปรับเลย์เอาต์ตามนั้น recommendedContentBoxInFullSpace จะระบุ ขนาดที่เฉพาะเจาะจงสำหรับกรอบล้อมรอบภายใน ActivitySpace เพื่อ ให้วางเนื้อหาภายในขอบเขตการมองเห็นของผู้ใช้ได้
เนื้อหาหลักของแอปควรพอดีกับกล่องนี้ หากมีเนื้อหาที่ต้องเกินขอบเขตที่แนะนำ ให้พิจารณาเลย์เอาต์ที่กระตุ้นให้ผู้ใช้สำรวจพื้นที่โดยการขยับศีรษะ คุณสามารถลบล้างข้อจำกัดเริ่มต้นของ
recommendedContentBoxInFullSpace ได้โดยใช้
ตัวปรับแต่งที่กำหนดเองตามขนาด เช่น SubspaceModifier.requiredSizeIn หากต้องการให้มีลักษณะการทำงานแบบไม่จำกัด ให้ตั้งค่า allowUnboundedSubspace = true
เรียกใช้ recommendedContentBoxInFullSpace โดยใช้ เซสชัน ปัจจุบันเพื่อ
รับขนาดที่เฉพาะเจาะจงเหล่านี้ตามต้องการ ดูตัวอย่างต่อไปนี้
val session = LocalSession.current session?.scene?.activitySpace?.recommendedContentBoxInFullSpace
เพิ่มพื้นที่ย่อยลงในแอป
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีเพิ่ม Subspace และ
PlanarEmbeddedSubspace ลงในแอป
setContent { // This is a top-level subspace Subspace { SpatialPanel { MyComposable() } } }
@Composable private fun MyComposable() { Row { PrimaryPane() SecondaryPane() } } @Composable private fun PrimaryPane() { // This is an embedded subspace, because PrimaryPane is in a SpatialPanel // and that SpatialPanel is in the top-level Subspace PlanarEmbeddedSubspace { SpatialPanel {} } }
ดูรายละเอียดเพิ่มเติมได้ในเอกสารอ้างอิงฉบับเต็มเกี่ยวกับ Subspace และ
PlanarEmbeddedSubspace