Thêm không gian con vào ứng dụng

Các thiết bị XR áp dụng
Hướng dẫn này giúp bạn tạo trải nghiệm cho các loại thiết bị XR này.
Kính XR
Kính XR có dây

Không gian phụ là một phân vùng của không gian 3D trong ứng dụng của bạn. Trong không gian phụ, bạn có thể đặt mô hình 3D, tạo bố cục 3D và thêm chiều sâu cho nội dung 2D. Không gian con chỉ được kết xuất khi bạn bật tính năng không gian hoá. Trong Không gian gia đình hoặc trên các thiết bị không phải XR, mọi mã trong không gian con đó đều bị bỏ qua.

Bạn có thể dùng các thành phần kết hợp không gian con như SpatialPanel, SpatialRowSpatialColumn để tạo bố cục và đặt nội dung 2D trong không gian 3D. Để đặt nội dung 3D, hãy sử dụng Subspace Composable thích hợp như SceneCoreEntity cho mô hình 3D và SpatialExternalSurface cho hình ảnh nổi. Một số thành phần XR như Orbiter hoặc SpatialDialog là các thành phần kết hợp 2D tiêu chuẩn có thể dùng ở bất kỳ đâu trong hệ phân cấp giao diện người dùng 2D, nhưng bạn phải gọi SubspaceComposable trong không gian con của ứng dụng. Để làm việc này, hãy sử dụng thành phần kết hợp không gian con Subspace.

Giới thiệu về hệ phân cấp không gian con

Subspace cấp cao nhất là không gian con ngoài cùng do ứng dụng của bạn gọi. Mỗi lệnh gọi đến Subspace sẽ tạo một hệ phân cấp Giao diện người dùng không gian mới, độc lập. Nó không kế thừa vị trí không gian, hướng hoặc tỷ lệ của bất kỳ Subspace mẹ nào mà nó được lồng trong đó.

Để tạo một Subspace được nhúng hoặc lồng trong SpatialPanel, Orbiter, SpatialPopup hoặc thành phần khác, hãy sử dụng PlanarEmbeddedSubspace.

PlanarEmbeddedSubspace có 2 điểm khác biệt chính so với Subspace:

  • Chúng tham gia vào bố cục 2D mà chúng được gọi. Điều này có nghĩa là chiều cao và chiều rộng của không gian con sẽ bị hạn chế bởi chiều cao và chiều rộng của bố cục gốc 2D.
  • Chúng hoạt động như các phần tử con của thực thể mà chúng được gọi. Điều này có nghĩa là nếu bạn gọi một thành phần kết hợp không gian con được lồng bên trong một SpatialPanel, thì không gian con đó là phần tử con của SpatialPanel mà không gian con đó được gọi.

Những hành vi này của PlanarEmbeddedSubspace cho phép các chức năng như:

  • Di chuyển trẻ cùng với thực thể mẹ
  • Bù vị trí của thành phần con bằng cách sử dụng phần bù SubspaceModifier
  • Trình bày một đối tượng 3D lơ lửng phía trên giao diện người dùng 2D và có chiều cao cũng như chiều rộng phù hợp với không gian thích hợp trong bố cục 2D

Điều chỉnh bố cục cho không gian phụ

Trên Android XR, bố cục của ứng dụng được liên kết với VolumeConstraints của Subspace theo mặc định ở Chế độ toàn không gian. Vì lý do này, bạn nên cân nhắc lượng không gian hiển thị mà người dùng có thể thấy và điều chỉnh bố cục cho phù hợp. recommendedContentBoxInFullSpace cung cấp các kích thước cụ thể cho hộp giới hạn bên trong ActivitySpace để nội dung có thể được đặt trong trường nhìn của người dùng.

Nội dung chính của ứng dụng phải nằm trong hộp này. Nếu bạn có nội dung phải vượt quá ranh giới được đề xuất, hãy cân nhắc bố cục khuyến khích người dùng khám phá không gian bằng cách di chuyển đầu. Bạn có thể ghi đè điều kiện ràng buộc mặc định của recommendedContentBoxInFullSpace bằng cách áp dụng một đối tượng sửa đổi tuỳ chỉnh dựa trên kích thước, chẳng hạn như SubspaceModifier.requiredSizeIn. Đối với hành vi không bị ràng buộc, hãy đặt allowUnboundedSubspace = true.

Gọi recommendedContentBoxInFullSpace bằng Session hiện tại để nhận các phương diện cụ thể này nếu cần. Hãy xem ví dụ sau:

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

Thêm một không gian phụ vào ứng dụng

Ví dụ về mã sau đây cho thấy cách thêm SubspacePlanarEmbeddedSubspace vào ứng dụng của bạn:

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

Hãy xem tài liệu tham khảo đầy đủ về SubspacePlanarEmbeddedSubspace để biết thêm thông tin chi tiết.