Dodawanie podprzestrzeni do aplikacji

Obsługiwane urządzenia z XR
Te wskazówki pomogą Ci tworzyć aplikacje na te typy urządzeń z XR.
Gogle XR
Przewodowe okulary XR

Podprzestrzeń to część przestrzeni 3D w aplikacji, w której możesz umieszczać modele 3D, tworzyć układy 3D i dodawać głębię do treści 2D. Podprzestrzeń jest renderowana tylko wtedy, gdy włączona jest przestrzenność. W przestrzeni głównej lub na urządzeniach bez XR każdy kod w tej podprzestrzeni jest ignorowany.

Do tworzenia układu i umieszczania treści 2D w przestrzeni 3D możesz używać komponentów podprzestrzeni, takich jak SpatialPanel, SpatialRow, i SpatialColumn. Do umieszczania treści 3D używaj odpowiedniego komponentu podprzestrzeni, np. SceneCoreEntity w przypadku modeli 3D i SpatialExternalSurface w przypadku obrazów stereoskopowych. Niektóre komponenty XR, takie jak Orbiter czy SpatialDialog to standardowe komponenty 2D, których można używać w dowolnym miejscu w hierarchii interfejsu 2D, ale komponent SubspaceComposable musi być wywoływany w podprzestrzeni aplikacji. Aby to zrobić, użyj komponentu podprzestrzeni Subspace.

Informacje o hierarchiach podprzestrzeni

Subspace`Subspace` najwyższego poziomu to najbardziej zewnętrzna podprzestrzeń wywoływana przez aplikację. Każde wywołanie Subspace`Subspace` tworzy nową, niezależną hierarchię interfejsu przestrzennego. Nie dziedziczy ona pozycji przestrzennej, orientacji ani skali żadnej nadrzędnej Subspace, w której jest zagnieżdżona.

Aby utworzyć osadzoną lub zagnieżdżoną Subspace w SpatialPanel, Orbiter, SpatialPopup, lub innym komponencie, użyj PlanarEmbeddedSubspace.

PlanarEmbeddedSubspace różni się od Subspace 2 kluczowymi kwestiami:

  • Uczestniczą w układzie 2D, w którym są wywoływane. Oznacza to, że wysokość i szerokość podprzestrzeni będą ograniczone przez wysokość i szerokość jej nadrzędnego układu 2D.
  • Zachowują się jak elementy podrzędne encji, w której są wywoływane. Oznacza to, że, jeśli wywołasz komponent podprzestrzeni zagnieżdżony w SpatialPanel, ta podprzestrzeń będzie elementem podrzędnym SpatialPanel w którym jest wywoływana.

Te zachowania PlanarEmbeddedSubspace umożliwiają takie funkcje jak:

  • przesuwanie elementu podrzędnego razem z elementem nadrzędnym,
  • przesuwanie lokalizacji elementu podrzędnego za pomocą przesunięcia SubspaceModifier
  • wyświetlanie obiektu 3D, który unosi się nad interfejsem 2D i ma wysokość i szerokość odpowiedniej przestrzeni w układzie 2D.

Dostosowywanie układów do podprzestrzeni

W Androidzie XR układ aplikacji jest domyślnie powiązany z VolumeConstraints w Subspace w trybie pełnej przestrzeni. Z tego powodu musisz wziąć pod uwagę ilość widocznej przestrzeni dostępnej dla użytkownika i odpowiednio dostosować układ. recommendedContentBoxInFullSpace określa szczegółowe wymiary ramki ograniczającej w ActivitySpace, dzięki czemu treści mogą być umieszczane w polu widzenia użytkownika.

Główne treści aplikacji powinny mieścić się w tym polu. Jeśli masz treści, które muszą wykraczać poza zalecane granice, rozważ układ, który zachęca użytkowników do eksplorowania przestrzeni przez poruszanie głową. Domyślne ograniczenie recommendedContentBoxInFullSpace można zastąpić, stosując niestandardowy modyfikator oparty na rozmiarze, np. SubspaceModifier.requiredSizeIn. Aby uzyskać nieograniczone działanie, ustaw allowUnboundedSubspace = true.

Aby w razie potrzeby uzyskać te konkretne wymiary, wywołaj recommendedContentBoxInFullSpace za pomocą bieżącej sesji, aby je uzyskać. Przyjrzyj się temu przykładowi:

val session = LocalSession.current
session?.scene?.activitySpace?.recommendedContentBoxInFullSpace

Dodawanie podprzestrzeni do aplikacji

Poniższy przykład kodu pokazuje, jak dodać Subspace i PlanarEmbeddedSubspace do aplikacji:

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 {}
    }
}

Więcej informacji znajdziesz w pełnej dokumentacji referencyjnej dotyczącej Subspace i PlanarEmbeddedSubspace.