Android XR SDK זמין עכשיו בתצוגה מקדימה למפתחים. אנו רוצים את המשוב שלך! אפשר לפנות אלינו דרך
דף התמיכה.
הוספת תת-מרחב לאפליקציה
קל לארגן דפים בעזרת אוספים
אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.
מרחב משנה הוא מחיצה של מרחב תלת-ממדי באפליקציה, שבה אפשר למקם מודלים תלת-ממדיים, ליצור פריסות תלת-ממדיות ולהוסיף עומק לתוכן דו-ממדי. תת-מרחב מוצג רק כשהמיקום במרחב פעיל. במרחב הבית או במכשירים שאינם XR, המערכת מתעלמת מכל קוד במרחב המשנה הזה.
אפשר להשתמש ברכיבים של מרחבים משניים, כמו Volume
ו-SpatialPanel
, כדי למקם מודלים תלת-ממדיים. חלק מרכיבי ה-XR, כמו Orbiter
או SpatialDialog
, הם רכיבים סטנדרטיים לשילוב ב-2D שאפשר להשתמש בהם בכל מקום בהיררכיית ממשק המשתמש הדו-מימדי, אבל צריך להפעיל רכיבי SubspaceComposable
במרחב המשנה של האפליקציה. כדי לעשות זאת, משתמשים ב-composable של ApplicationSubspace
או ב-composable של Subspace
.
כפי שרומז השם, הרכיב הניתן לקישור ApplicationSubspace
צריך להכיל את כל התוכן המרחבי של האפליקציה. הרכיב הניתן לקיבוץ Subspace
הוא אידיאלי להטמעת מחיצה של מרחב תלת-ממדי עמוק יותר בהיררכיית ממשק המשתמש הקיימת של האפליקציה.
כמו כל רכיב אחר שאפשר ליצור ממנו רכיבים מורכבים, אפשר להפעיל את Subspace
ישירות בהיררכיית ממשק המשתמש הדו-מימדי. עם זאת, חשוב לדעת מהן ההשלכות של המקום שבו מפעילים את Subspace
בהיררכיה.
מידע על היררכיות של מרחבים משניים
המרחב המשנה ברמה העליונה הוא המרחב המשנה החיצוני ביותר שהאפליקציה מפעילה. צריך להשתמש ב-composable ApplicationSubspace
למרחב המשנה ברמה העליונה, אבל אם משתמשים רק ב-composable של Subspace באפליקציה, ה-composable החיצוני ביותר של Subspace
יהיה המרחב המשנה ברמה העליונה. במרחב המשנה ברמה העליונה הזה, המוגדר כברירת מחדל, מוגדר המרחב המומלץ להצגת האפליקציה. בדרך כלל זהו המיקום שבו ממוקמים הפריסה המרחבית של האפליקציה ו-SpatialPanel
. אם צריך לשנות את הגבולות של המרחב המשני ברמה העליונה, מעבירים VolumeConstraints
שונה ל-ApplicationSubspace
.
עם זאת, אם תמקמו תת-מרחב אחר בתוך היררכיית ממשק משתמש דו-מימדי בחלונית שמכילה את תת-המרחב ברמה העליונה, תת-המרחב המוטמע יתנהג בצורה שונה.
למרחבים משניים בתצוגת עץ יש שני הבדלים עיקריים מ-Subspace
ברמה העליונה:
- הם משתתפים בפריסה הדו-ממדית שבה הם מופעלים. המשמעות היא שהגובה והרוחב של המרחב המשני יהיו מוגבלים על ידי הגובה והרוחב של הפריסה ההורה הדו-ממדית שלו.
- הם מתנהגים כצאצאים של הישות שבה הם מופעלים. כלומר, אם קוראים ל-composable של
Subspace
שמוטמע בתוך SpatialPanel
, המרחב המשנה הזה הוא צאצא של SpatialPanel
שבו הוא נקרא.
ההתנהגויות האלה של תת-מרחב עץ מאפשרות יכולות כמו:
- העברת הצאצא עם הישות ההורה
- שינוי המיקום של הילד או הילדה באמצעות שינוי המיקום
SubspaceModifier
- הצגת אובייקט תלת-ממדי שמרחף מעל ממשק המשתמש הדו-ממדי ומתאים לגובה ולרוחב של המרחב המתאים בפריסה הדו-ממדית
הוספת תת-מרחב לאפליקציה
בדוגמת הקוד הבאה מוסבר איך להוסיף לאפליקציה מרחבים משניים ברמה העליונה ומרחבים משניים בתצוגת עץ:
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-23 (שעון 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-23 (שעון UTC)."],[],[],null,["# Add a subspace to your app\n\nA 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--------------------------\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--------------------------\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/dd30aee903e8c247786c064faab1a9ca8d10b46e/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/dd30aee903e8c247786c064faab1a9ca8d10b46e/xr/src/main/java/com/example/xr/compose/Subspace.kt#L47-L62\n```\n\n\u003cbr /\u003e"]]