เพิ่มพื้นที่ย่อยลงในแอป

อุปกรณ์ XR ที่รองรับ
คำแนะนำนี้จะช่วยคุณสร้างประสบการณ์การใช้งานสำหรับอุปกรณ์ XR ประเภทต่างๆ
ชุดหูฟัง XR
แว่นตา XR แบบใช้สาย

พื้นที่ย่อยคือพาร์ติชันของพื้นที่ 3 มิติภายในแอปที่คุณสามารถวางโมเดล 3 มิติ สร้างเลย์เอาต์ 3 มิติ และเพิ่มความลึกให้กับเนื้อหา 2 มิติ พื้นที่ย่อยจะแสดงผลเมื่อเปิดใช้การสร้างเสียง 3 มิติเท่านั้น ใน Home Space หรือในอุปกรณ์ที่ไม่ใช่ XR ระบบจะละเว้นโค้ดใดๆ ภายในพื้นที่ย่อยนั้น

คุณสามารถใช้ Composable ของพื้นที่ย่อย เช่น SpatialPanel, SpatialRow, และ SpatialColumn เพื่อสร้างเลย์เอาต์และวางเนื้อหา 2 มิติในพื้นที่ 3 มิติ หากต้องการวางเนื้อหา 3 มิติ ให้ใช้ Subspace Composable ที่เหมาะสม เช่น SceneCoreEntity สำหรับโมเดล 3 มิติ และ SpatialExternalSurface สำหรับ รูปภาพสเตอริโอ คอมโพเนนต์ XR บางอย่าง เช่น Orbiter หรือ SpatialDialog เป็น Composable 2 มิติมาตรฐานที่ใช้ได้ทุกที่ในลำดับชั้น UI 2 มิติ แต่ต้องเรียกใช้ SubspaceComposable ในพื้นที่ย่อยของแอป หากต้องการทำ เช่นนี้ ให้ใช้ Composable ของพื้นที่ย่อย Subspace

เกี่ยวกับลำดับชั้นของพื้นที่ย่อย

Subspace ระดับบนสุดคือพื้นที่ย่อยด้านนอกสุดที่แอปเรียกใช้ การเรียกใช้ Subspace แต่ละครั้งจะสร้างลำดับชั้น UI เชิงพื้นที่ใหม่ที่เป็นอิสระ โดยจะไม่รับช่วงตำแหน่งเชิงพื้นที่ การวางแนว หรือการปรับขนาดของ Subspace ระดับบนสุดที่ซ้อนอยู่

หากต้องการสร้าง Subspace ที่ฝังหรือซ้อนอยู่ภายใน SpatialPanel, Orbiter, SpatialPopup หรือคอมโพเนนต์อื่นๆ ให้ใช้ PlanarEmbeddedSubspace

PlanarEmbeddedSubspace มีความแตกต่างที่สำคัญ 2 ประการจาก Subspace ดังนี้

  • มีส่วนร่วมในเลย์เอาต์ 2 มิติที่เรียกใช้ ซึ่งหมายความว่าความสูงและความกว้างของพื้นที่ย่อยจะถูกจำกัดด้วยความสูงและความกว้างของเลย์เอาต์หลัก 2 มิติ
  • ทำงานเป็นองค์ประกอบย่อยของเอนทิตีที่เรียกใช้ ซึ่งหมายความว่า หากคุณเรียกใช้ Composable ของพื้นที่ย่อยที่ซ้อนอยู่ภายใน SpatialPanel พื้นที่ย่อยนั้นจะเป็นองค์ประกอบย่อยของ SpatialPanel ที่เรียกใช้

ลักษณะการทำงานของ PlanarEmbeddedSubspace ช่วยให้สามารถทำสิ่งต่างๆ ได้ เช่น

  • ย้ายองค์ประกอบย่อยไปพร้อมกับเอนทิตีหลัก
  • ชดเชยตำแหน่งขององค์ประกอบย่อยโดยใช้ที่ชดเชย SubspaceModifier
  • แสดงออบเจ็กต์ 3 มิติที่ลอยอยู่เหนือ UI 2 มิติและมีความสูงและความกว้างเท่ากับพื้นที่ที่เหมาะสมในเลย์เอาต์ 2 มิติ

ปรับเลย์เอาต์สำหรับพื้นที่ย่อย

ใน Android XR เลย์เอาต์ของแอปจะผูกกับ VolumeConstraints ของ Subspace ในโหมด Full Space โดยค่าเริ่มต้น ด้วยเหตุนี้ คุณจึงควรพิจารณาพื้นที่ที่มองเห็นได้ซึ่งผู้ใช้สามารถใช้ได้และปรับเลย์เอาต์ตามนั้น recommendedContentBoxInFullSpace จะระบุ ขนาดที่เฉพาะเจาะจงสำหรับกรอบล้อมรอบภายใน ActivitySpace เพื่อ ให้วางเนื้อหาภายในขอบเขตการมองเห็นของผู้ใช้ได้

เนื้อหาหลักของแอปควรพอดีกับกล่องนี้ หากมีเนื้อหาที่ต้องเกินขอบเขตที่แนะนำ ให้พิจารณาเลย์เอาต์ที่กระตุ้นให้ผู้ใช้สำรวจพื้นที่โดยการขยับศีรษะ คุณสามารถลบล้างข้อจำกัดเริ่มต้นของ recommendedContentBoxInFullSpace ได้โดยใช้ ตัวปรับแต่งที่กำหนดเองตามขนาด เช่น SubspaceModifier.requiredSizeIn หากต้องการให้มีลักษณะการทำงานแบบไม่จำกัด ให้ตั้งค่า allowUnboundedSubspace = true

เรียกใช้ recommendedContentBoxInFullSpace โดยใช้ เซสชัน ปัจจุบันเพื่อ รับขนาดที่เฉพาะเจาะจงเหล่านี้ตามต้องการ ดูตัวอย่างต่อไปนี้

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

เพิ่มพื้นที่ย่อยลงในแอป

ตัวอย่างโค้ดต่อไปนี้แสดงวิธีเพิ่ม Subspace และ PlanarEmbeddedSubspace ลงในแอป

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

ดูรายละเอียดเพิ่มเติมได้ในเอกสารอ้างอิงฉบับเต็มเกี่ยวกับ Subspace และ PlanarEmbeddedSubspace