تتوفّر حزمة تطوير البرامج (SDK) لنظام Android XR الآن في "معاينة المطوّر". يهمّنا معرفة ملاحظاتك. يُرجى الانتقال إلى
صفحة الدعم للتواصل معنا.
إضافة مساحة فرعية إلى تطبيقك
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
المساحة الفرعية هي قسم من المساحة الثلاثية الأبعاد داخل تطبيقك حيث يمكنك وضع نماذج ثلاثية الأبعاد
وإنشاء تصاميم ثلاثية الأبعاد وإضافة عمق إلى المحتوى ثنائي الأبعاد. لا يتم عرض المساحة الفرعية إلا عند تفعيل ميزة "الصوت المكاني". في "المساحة الرئيسية" أو على الأجهزة غير المزوّدة بتقنية XR، يتم تجاهل أي رمز ضمن هذا الفضاء الفرعي.
يمكنك استخدام العناصر القابلة للتجميع في المساحات الفرعية، مثل Volume
وSpatialPanel
لوضع النماذج الثلاثية الأبعاد. إنّ بعض مكوّنات الواقع المعزّز، مثل Orbiter
أو
SpatialDialog
، هي عناصر قابلة للتجميع ثنائية الأبعاد يمكن استخدامها في أي مكان في
تسلسل واجهة المستخدم ثنائية الأبعاد، ولكن يجب استدعاء عناصر SubspaceComposable
في
الفضاء الفرعي لتطبيقك. لإجراء ذلك، استخدِم العنصر القابل للتجميع ApplicationSubspace
أو
العنصر القابل للتجميع Subspace
.
كما يوحي الاسم، يجب أن يحتوي العنصر القابل للتجميع ApplicationSubspace
على
كل المحتوى المكاني في تطبيقك. عنصر Subspace
القابل للتجميع مثالي
لإدراج قسم من المساحة الثلاثية الأبعاد بشكل أعمق في التسلسل الهرمي الحالي لواجهة المستخدم في تطبيقك.
كما هو الحال مع أي عنصر قابل للتجميع آخر، يمكنك استدعاء Subspace
مباشرةً في التدرّج الهرمي لواجهة مستخدم ثنائية الأبعاد. ومع ذلك، من المهم أن تكون على دراية بالنتائج المترتبة على مكان
في التسلسل الهرمي الذي تستدعي فيه Subspace
.
لمحة عن تسلسلات المساحات الفرعية الهرمية
المساحة الفرعية ذات المستوى الأعلى هي المساحة الفرعية الخارجية التي يستدعيها تطبيقك. استخدِم العنصر القابل للتجميع
ApplicationSubspace
للمساحة الفرعية ذات المستوى الأعلى، ولكن إذا
كنت تستخدِم العنصر القابل للتجميع "المساحة الفرعية" فقط في تطبيقك، سيكون العنصر القابل للتجميعSubspace
الخارجي هو المساحة الفرعية ذات المستوى الأعلى. تكون هذه المساحة الفرعية من المستوى الأعلى محدودة تلقائيًا بالمساحة المقترَحة لعرض التطبيق، وهي عادةً ما تكون المكان الذي يتم فيه وضع التنسيق المكاني لتطبيقك وSpatialPanel
. إذا كنت بحاجة إلى
تغيير حدود الفضاء الفرعي من المستوى الأعلى، نقْل قيمة مختلفة
VolumeConstraints
إلى ApplicationSubspace
.
ومع ذلك، في حال تداخل مساحة فرعية أخرى داخل تسلسل هرمي لواجهة مستخدم ثنائية الأبعاد في لوحة
مضمّنة في المساحة الفرعية ذات المستوى الأعلى، سيختلف سلوك المساحة الفرعية المُدمجة.
هناك اختلافان رئيسيان بين المساحات الفرعية المُدمجة والمساحات Subspace
من المستوى الأعلى:
- وتشارك هذه العناصر في التخطيط ثنائي الأبعاد الذي يتمّ استدعاؤها فيه. وهذا يعني أنّه
سيتم تقييد ارتفاع المساحة الفرعية وعرضه بالارتفاع
والعرض لتنسيقها الرئيسي ثنائي الأبعاد.
- وتتصرف هذه العناصر كعناصر فرعية للكيان الذي يتم استدعاؤها فيه. وهذا يعني أنّه،
في حال استدعاء عنصر
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 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","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 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],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"]]