了解子空间修饰符

适用的 XR 设备
本指南可帮助您为以下类型的 XR 设备打造优质体验。
扩展现实头戴设备
有线扩展现实眼镜

SubspaceModifier 类似于 Subspace 中可组合项的 Compose 修饰符。借助 SubspaceModifier,您可以在 3D 空间中操纵可组合项,从而帮助您定位、旋转 3D 布局节点并为其添加行为。

布局

默认情况下,Subspace 的边界为应用推荐的可视空间范围。在测量子空间组件的布局时,系统会使用这些边界,这与 2D Compose 布局中的边界类似。

填充边界

修饰符 fillMaxSize、fillMaxWidth、fillMaxHeight 和 fillMaxDepth 可使内容(部分)填充其父元素的边界。 使用填充修饰符有助于应用布局不受 XR 设备显示特性影响的内容。

设置尺寸和所需尺寸

修饰符 size、width、height 和 depth 用于声明内容的首选尺寸。如需声明内容的精确尺寸,请使用 requiredSize、requiredWidth、requiredHeight 和 requiredDepth。这些尺寸单位必须以 dp 指定;如需将米转换为 dp,请使用 Meter.toDp()。

放置可组合项

offset

offset 修饰符可使可组合项在 3D 空间中沿 x、y 和 z 轴移动。这些单位必须以 dp 指定;如需将米转换为 dp,请使用 Meter.toDp()。

rotate

rotate 修饰符可使指定可组合项在空间中旋转。您可以通过多种方式指定旋转方向和角度:

  • 使用俯仰角、偏航角和横滚角,分别对应围绕 x、y 和 z 轴的旋转,
  • 使用 axisAngle,即通过一个 Vector3 表示旋转轴,并指定围绕该轴的旋转角度(以度为单位),
  • 使用 Quaternion 表示旋转。

rotateToLookAtUser

rotateToLookAtUser 修饰符会持续旋转内容,使其始终面向用户。您还可以使用此修饰符实现“广告牌”效果,即内容在 Y 轴上旋转以面向用户,同时仍保持直立并与重力对齐。为此,请将 rotateToLookAtUser 修饰符与 gravityAligned 修饰符结合使用。

移动可组合项和调整其大小

让用户可以直接操控 3D 空间中对象的位置和大小。

移动元素

当 movable 修饰符存在并启用时,系统会显示可拖动的界面控件,让用户能够在 3D 空间中移动元素。您可以将 movable 修饰符应用于整个 Subspace、空间布局组件(例如 SpatialRow 和 SpatialColumn)以及单个组件(例如 SpatialPanel 和 SpatialGltfModel)。

此移动的具体行为由提供的 movePolicy 定义:

  • MovePolicy.Default(或 MovePolicy.system()):系统会完全处理移动,并根据用户输入自动计算和应用新的姿势和缩放比例。
  • MovePolicy.custom():系统会根据输入计算目标 Pose,但不会自动将其应用于关联的元素。这对于在应用中限制移动或创建自定义移动非常有用。
  • MovePolicy.anchor():让用户将可移动元素贴靠并锚定到检测到的现实世界平面。

锚点可组合项

为了能够将可移动子空间可组合项锚定到现实世界中的表面,请将 MovePolicy.anchor() 传递给 movable 修饰符。此政策允许用户将元素(例如 SpatialPanel 和 SpatialGltfModel)贴靠到桌子、墙壁或地板等实体表面。

您可以使用以下参数过滤元素可以吸附到哪些检测到的平面(如果留空,元素可以锚定到任何检测到的平面):

  • anchorPlaneOrientations:一组 PlaneOrientation 值(Horizontal、Vertical 或 Any)。
  • anchorPlaneSemantics:一组 PlaneSemantic 值(Wall、Floor、Ceiling、Table 或 Any)。

调整元素大小

当 resizable() 修饰符存在并启用时,系统会显示界面控件,以便用户在 3D 空间中调整元素的大小。调整大小的具体行为由提供的 resizePolicy 定义:

  • ResizePolicy.default():系统会自动处理大小调整手势,并将新尺寸应用于内容。
  • ResizePolicy.custom():系统会提供 SpatialResizeEvent,并且不会自动将调整大小的结果应用于关联的元素。

更改可组合项的外观

alpha

alpha 修饰符用于设置元素及其子元素的不透明度,其中 0f 表示完全透明,1.0f 表示完全不透明。

scale

scale 修饰符可沿水平、垂直和深度轴缩放可组合项的内容。

测试和无障碍功能

semantics

semantics 修饰符会向布局节点添加语义,以便在测试和无障碍功能中使用。请参阅 Jetpack Compose 中的语义和 SemanticsModifier。

testTag

testTag 修饰符是 SemanticsPropertyReceiver.testTag 的简写形式,可让测试框架在测试中找到该元素。