Subspace คือพาร์ติชันของพื้นที่ 3 มิติภายในแอปที่คุณวางโมเดล 3 มิติ สร้างเลย์เอาต์ 3 มิติ และเพิ่มมิติให้กับเนื้อหา 2 มิติ โดยจะแสดงซับสเปซก็ต่อเมื่อเปิดใช้การปรับเสียงตามตำแหน่งเท่านั้น ในพื้นที่บ้านหรือในอุปกรณ์ที่ไม่ใช่ XR ระบบจะไม่สนใจโค้ดใดๆ ภายในพื้นที่ย่อยนั้น
คุณสามารถใช้ Composable ของ Subspace เช่น 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 มิติระดับบน
- โดยจะทำงานเป็นองค์ประกอบย่อยของเอนทิตีที่เรียกใช้ ซึ่งหมายความว่า หากคุณเรียกใช้ Subspace ที่สามารถประกอบได้ซึ่งซ้อนอยู่ภายใน
SpatialPanelSubspace นั้นจะเป็น Child ของ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 ไปยังแอป
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีเพิ่ม 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