Android XR SDK พร้อมใช้งานในเวอร์ชันตัวอย่างสำหรับนักพัฒนาแอปแล้ว เราอยากฟังความคิดเห็นจากคุณ โปรดไปที่
หน้าการสนับสนุนเพื่อติดต่อเรา
เพิ่มพื้นที่ย่อยลงในแอป
จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน
บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ
พื้นที่ย่อยคือส่วนของพื้นที่ 3 มิติภายในแอปที่คุณวางโมเดล 3 มิติ สร้างเลย์เอาต์ 3 มิติ และเพิ่มมิติให้กับเนื้อหา 2 มิติได้ ระบบจะแสดงผลพื้นที่ย่อยก็ต่อเมื่อเปิดใช้การจัดวางเสียงเท่านั้น ใน Home Space หรือในอุปกรณ์ที่ไม่ใช่ XR ระบบจะไม่สนใจโค้ดภายในพื้นที่ย่อยนั้น
คุณสามารถใช้คอมโพสิชันย่อย เช่น Volume
และ SpatialPanel
เพื่อวางโมเดล 3 มิติ คอมโพเนนต์ XR บางรายการ เช่น Orbiter
หรือ SpatialDialog
เป็นแบบ 2 มิติมาตรฐานที่ใช้ได้ทุกที่ในลําดับชั้น UI 2 มิติ แต่ต้องเรียกใช้ SubspaceComposable
ในเซบ์สเปซของแอป โดยจะใช้คอมโพสิเบิล ApplicationSubspace
หรือคอมโพสิเบิล Subspace
ก็ได้
ตามชื่อที่บอกไว้ คอมโพสิเบิล ApplicationSubspace
ควรมีเนื้อหาที่วางตำแหน่งตามพื้นที่ทั้งหมดของแอป คอมโพสิเบิล Subspace
เหมาะอย่างยิ่งสำหรับการฝังการแบ่งพื้นที่ 3 มิติให้ลึกลงไปในลําดับชั้น UI ที่มีอยู่ของแอป
คุณสามารถเรียกใช้ Subspace
ได้โดยตรงในลําดับชั้น 2D UI เช่นเดียวกับคอมโพสิเบิลอื่นๆ อย่างไรก็ตาม คุณควรตระหนักถึงผลที่ตามมาของตําแหน่งในลําดับชั้นที่คุณเรียกใช้ Subspace
เกี่ยวกับลําดับชั้นของพื้นที่ทำงานย่อย
พื้นที่ทำงานย่อยระดับบนสุดคือพื้นที่ทำงานย่อยด้านนอกสุดที่แอปเรียกใช้ ให้ใช้คอมโพสิเบิล ApplicationSubspace
สำหรับพื้นที่ทำงานย่อยระดับบนสุด แต่หากคุณใช้เฉพาะคอมโพสิเบิลพื้นที่ทำงานย่อยในแอป คอมโพสิเบิล Subspace
ด้านนอกสุดจะเป็นพื้นที่ทำงานย่อยระดับบนสุด โดยค่าเริ่มต้น พื้นที่ทำงานย่อยระดับบนสุดนี้จะกําหนดขอบเขตโดยพื้นที่ที่แนะนําสําหรับดูแอป และโดยปกติแล้วจะเป็นตําแหน่งที่คุณวางเลย์เอาต์เชิงพื้นที่และ SpatialPanel
ของแอป หากต้องการเปลี่ยนขอบเขตของเซสชันย่อยระดับบนสุด ให้ส่ง VolumeConstraints
อื่นไปยัง ApplicationSubspace
อย่างไรก็ตาม หากคุณฝังพื้นที่ทำงานย่อยอื่นภายในลําดับชั้น UI 2 มิติในแผงที่อยู่ในพื้นที่ทำงานย่อยระดับบนสุด พื้นที่ทำงานย่อยที่ฝังนั้นจะทํางานต่างจากเดิม
พื้นที่ทำงานย่อยที่ฝังมีความแตกต่างที่สำคัญ 2 ประการจาก Subspace
ระดับบนสุด
- โดยจะอยู่ในเลย์เอาต์ 2 มิติที่เรียกใช้ ซึ่งหมายความว่าความสูงและความกว้างของพื้นที่ย่อยจะจำกัดตามความสูงและความกว้างของเลย์เอาต์หลัก 2 มิติ
- โดยจะทํางานเป็นองค์ประกอบย่อยของเอนทิตีที่เรียกใช้ ซึ่งหมายความว่าหากคุณเรียกใช้คอมโพสิเบิล
Subspace
ที่ฝังอยู่ภายใน SpatialPanel
นั้น ซับสเปซดังกล่าวจะเป็นซับสเปซย่อยของ SpatialPanel
ที่เรียกใช้
ลักษณะการทํางานของพื้นที่ย่อยที่ซ้อนกันเหล่านี้จะเปิดใช้ความสามารถต่างๆ เช่น
- การย้ายเอนทิตีย่อยไปพร้อมกับเอนทิตีหลัก
- การปรับตำแหน่งของบุตรหลานโดยใช้ออฟเซต
SubspaceModifier
- การนำเสนอวัตถุ 3 มิติที่วางอยู่เหนือ UI 2 มิติและตรงกับความสูงและความกว้างของพื้นที่ที่เหมาะสมในเลย์เอาต์ 2 มิติ
เพิ่มพื้นที่ย่อยลงในแอป
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีเพิ่มพื้นที่ทำงานย่อยระดับบนสุดและที่ฝังลงในแอป
setContent {
// This is a top-level subspace
ApplicationSubspace {
SpatialPanel {
MyComposable()
}
}
}
@Composable
private fun MyComposable() {
Row {
PrimaryPane()
SecondaryPane()
}
}
@Composable
private fun PrimaryPane() {
// This is a nested subspace, because PrimaryPane is in a SpatialPanel
// and that SpatialPanel is in a top-level Subspace
Subspace {
ObjectInAVolume(true)
}
}
ตัวอย่างเนื้อหาและโค้ดในหน้าเว็บนี้ขึ้นอยู่กับใบอนุญาตที่อธิบายไว้ในใบอนุญาตการใช้เนื้อหา Java และ OpenJDK เป็นเครื่องหมายการค้าหรือเครื่องหมายการค้าจดทะเบียนของ Oracle และ/หรือบริษัทในเครือ
อัปเดตล่าสุด 2025-08-28 UTC
[[["เข้าใจง่าย","easyToUnderstand","thumb-up"],["แก้ปัญหาของฉันได้","solvedMyProblem","thumb-up"],["อื่นๆ","otherUp","thumb-up"]],[["ไม่มีข้อมูลที่ฉันต้องการ","missingTheInformationINeed","thumb-down"],["ซับซ้อนเกินไป/มีหลายขั้นตอนมากเกินไป","tooComplicatedTooManySteps","thumb-down"],["ล้าสมัย","outOfDate","thumb-down"],["ปัญหาเกี่ยวกับการแปล","translationIssue","thumb-down"],["ตัวอย่าง/ปัญหาเกี่ยวกับโค้ด","samplesCodeIssue","thumb-down"],["อื่นๆ","otherDown","thumb-down"]],["อัปเดตล่าสุด 2025-08-28 UTC"],[],[],null,["A subspace is a partition of 3D space within your app where you can place 3D\nmodels, build 3D layouts, and add depth to otherwise 2D content. A subspace is\nrendered only when spatialization is enabled. In Home Space or on non-XR\ndevices, any code within that subspace is ignored.\n\nYou can use subspace composables such as [`Volume`](/reference/kotlin/androidx/xr/compose/subspace/package-summary#Volume(androidx.xr.compose.subspace.layout.SubspaceModifier,kotlin.Function1)) and [`SpatialPanel`](/reference/kotlin/androidx/xr/compose/subspace/package-summary#SpatialPanel(androidx.xr.compose.subspace.layout.SubspaceModifier,androidx.xr.compose.subspace.layout.SpatialShape,kotlin.Function0))\nfor placing 3D models. Some XR components such as [`Orbiter`](/reference/kotlin/androidx/xr/compose/spatial/package-summary#Orbiter(androidx.xr.compose.spatial.ContentEdge.Horizontal,androidx.compose.ui.unit.Dp,androidx.xr.compose.spatial.OrbiterOffsetType,androidx.compose.ui.Alignment.Horizontal,androidx.xr.compose.subspace.layout.SpatialShape,androidx.compose.ui.unit.Dp,kotlin.Boolean,kotlin.Function0)) or\n[`SpatialDialog`](/reference/kotlin/androidx/xr/compose/spatial/package-summary#SpatialDialog(kotlin.Function0,androidx.xr.compose.spatial.SpatialDialogProperties,kotlin.Function0)) are standard 2D composables that can be used anywhere in\nyour 2D UI hierarchy, but [`SubspaceComposable`](/reference/kotlin/androidx/xr/compose/subspace/SubspaceComposable)s must be invoked in your\napp's subspace. To do this, use either the `ApplicationSubspace` composable or\nthe [`Subspace`](/reference/kotlin/androidx/xr/compose/spatial/package-summary#Subspace(kotlin.Function1)) composable.\n\nAs the name suggests, the [`ApplicationSubspace`](/reference/kotlin/androidx/xr/compose/spatial/package-summary#ApplicationSubspace(androidx.xr.compose.unit.VolumeConstraints,androidx.xr.compose.spatial.ConstraintsBehavior,kotlin.Function1)) composable should contain\nall of your app's spatialized content. The [`Subspace`](/reference/kotlin/androidx/xr/compose/spatial/package-summary#Subspace(kotlin.Function1)) composable is ideal\nfor nesting a partition of 3D space deeper in your app's existing UI hierarchy.\n\nAs with any other composable, you can call [`Subspace`](/reference/kotlin/androidx/xr/compose/spatial/package-summary#Subspace(kotlin.Function1)) directly in your 2D\nUI hierarchy. However, it's important to be aware of the implications of where\nin the hierarchy you invoke [`Subspace`](/reference/kotlin/androidx/xr/compose/spatial/package-summary#Subspace(kotlin.Function1)).\n\nAbout subspace hierarchies\n\nThe top-level subspace is the outermost subspace invoked by your app. Use the\n[`ApplicationSubspace`](/reference/kotlin/androidx/xr/compose/spatial/package-summary#ApplicationSubspace(androidx.xr.compose.unit.VolumeConstraints,androidx.xr.compose.spatial.ConstraintsBehavior,kotlin.Function1)) composable for your top-level subspace, but, if you\nonly use the Subspace composable in your app, the outermost `Subspace`\ncomposable will be your top-level subspace. By default, this top-level subspace\nis bounded by the recommended space for viewing an app, and it's typically where\nyou place your app's spatial layout and [`SpatialPanel`](/reference/kotlin/androidx/xr/compose/subspace/package-summary#SpatialPanel(androidx.xr.compose.subspace.layout.SubspaceModifier,androidx.xr.compose.subspace.layout.SpatialShape,kotlin.Function0)). If you need to\nchange the bounds of the top-level subspace, pass different\n[`VolumeConstraints`](/reference/kotlin/androidx/xr/compose/unit/VolumeConstraints) to your [`ApplicationSubspace`](/reference/kotlin/androidx/xr/compose/spatial/package-summary#ApplicationSubspace(androidx.xr.compose.unit.VolumeConstraints,androidx.xr.compose.spatial.ConstraintsBehavior,kotlin.Function1)).\n\nHowever, if you nest another subspace inside of a 2D UI hierarchy in a panel\nthat's contained in the top-level subspace, that nested subspace behaves\ndifferently.\n\nNested subspaces have two key differences from top-level [`Subspace`](/reference/kotlin/androidx/xr/compose/spatial/package-summary#Subspace(kotlin.Function1)):\n\n- They participate in the 2D layout in which they are invoked. This means that the height and width of the subspace will be constrained by the height and width of its 2D parent layout.\n- They behave as children of the entity they're invoked in. This means that, if you call a [`Subspace`](/reference/kotlin/androidx/xr/compose/spatial/package-summary#Subspace(kotlin.Function1)) composable nested inside of a [`SpatialPanel`](/reference/kotlin/androidx/xr/compose/subspace/package-summary#SpatialPanel(androidx.xr.compose.subspace.layout.SubspaceModifier,androidx.xr.compose.subspace.layout.SpatialShape,kotlin.Function0)), that subspace is a child of the [`SpatialPanel`](/reference/kotlin/androidx/xr/compose/subspace/package-summary#SpatialPanel(androidx.xr.compose.subspace.layout.SubspaceModifier,androidx.xr.compose.subspace.layout.SpatialShape,kotlin.Function0)) it's called in.\n\nThese behaviors of nested subspace enable capabilities such as:\n\n- Moving the child with the parent entity\n- Offsetting the location of the child using the offset [`SubspaceModifier`](/reference/kotlin/androidx/xr/compose/subspace/layout/SubspaceModifier)\n- Presenting a 3D object that hovers above your 2D UI and matches the height and width of the appropriate space in the 2D layout\n\nAdd a subspace to your app\n\nThe following code example shows how to add top-level and nested subspaces to\nyour app:\n\n\n```kotlin\nsetContent {\n // This is a top-level subspace\n ApplicationSubspace {\n SpatialPanel {\n MyComposable()\n }\n }\n}https://github.com/android/snippets/blob/7a0ebbee11495f628cf9d574f6b6069c2867232a/xr/src/main/java/com/example/xr/compose/Subspace.kt#L34-L41\n```\n\n\u003cbr /\u003e\n\n\n```kotlin\n@Composable\nprivate fun MyComposable() {\n Row {\n PrimaryPane()\n SecondaryPane()\n }\n}\n\n@Composable\nprivate fun PrimaryPane() {\n // This is a nested subspace, because PrimaryPane is in a SpatialPanel\n // and that SpatialPanel is in a top-level Subspace\n Subspace {\n ObjectInAVolume(true)\n }\n}https://github.com/android/snippets/blob/7a0ebbee11495f628cf9d574f6b6069c2867232a/xr/src/main/java/com/example/xr/compose/Subspace.kt#L47-L62\n```\n\n\u003cbr /\u003e"]]