Jetpack Compose สำหรับ XR

สร้างเลย์เอาต์ UI แบบเชิงพื้นที่แบบประกาศเพื่อใช้ประโยชน์จากความสามารถเชิงพื้นที่ของ Android XR
อัปเดตล่าสุด รุ่นที่เสถียร รุ่นที่อาจได้รับการเผยแพร่ รุ่นเบต้า เวอร์ชันอัลฟ่า
7 พฤษภาคม 2025 - - - 1.0.0-alpha04

การประกาศทรัพยากร Dependency

หากต้องการเพิ่มทรัพยากร Dependency ของ XR Compose คุณต้องเพิ่มที่เก็บ Maven ของ Google ลงในโปรเจ็กต์ อ่านข้อมูลเพิ่มเติมในที่เก็บ Maven ของ Google

เพิ่มการอ้างอิงสำหรับอาร์ติแฟกต์ที่คุณต้องการในไฟล์ build.gradle สำหรับแอปหรือโมดูล

ดึงดูด

dependencies {
    implementation "androidx.xr.compose:compose:1.0.0-alpha04"

    // Use to write unit tests
    testImplementation "androidx.xr.compose:compose-testing:1.0.0-alpha04"
}

Kotlin

dependencies {
    implementation("androidx.xr.compose:compose:1.0.0-alpha04")

    // Use to write unit tests
    testImplementation("androidx.xr.compose:compose-testing:1.0.0-alpha04")
}

ดูข้อมูลเพิ่มเติมเกี่ยวกับการพึ่งพาได้ที่เพิ่มการพึ่งพิงบิวด์

ความคิดเห็น

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

สร้างปัญหาใหม่

ดูข้อมูลเพิ่มเติมได้ที่เอกสารประกอบของเครื่องมือติดตามปัญหา

รุ่น 1.0

เวอร์ชัน 1.0.0-alpha04

7 พฤษภาคม 2025

androidx.xr.compose:compose:1.0.0-alpha04 และ androidx.xr.compose:compose-testing:1.0.0-alpha04 เผยแพร่แล้ว เวอร์ชัน 1.0.0-alpha04 มีการคอมมิตเหล่านี้

ฟีเจอร์ใหม่

  • เพิ่มอินเทอร์เฟซ CompositionLocalConsumerSubspaceModifierNode เพื่ออนุญาตให้ประเภท SubspaceModifier ที่กําหนดเองเข้าถึงค่าในเครื่องขององค์ประกอบ
  • เพิ่ม SpatialPanel API ใหม่ที่ใช้รูปแบบการติดตั้งใช้งาน Compose AndroidView และเลิกใช้งาน ViewBased SpatialPanel เวอร์ชันเก่า
  • เพิ่มออบเจ็กต์สหาย VolumeConstraints.Unbounded ซึ่งแสดงข้อจำกัดที่ไม่มีขอบเขต
  • เพิ่ม SubspaceModifier.onPointSourceParams เพื่ออนุญาตให้ใช้แหล่งที่มาของเสียงแบบเสียงรอบทิศทาง
  • เพิ่ม ApplicationSubspace สาธารณะแล้ว ซึ่งจะมี VolumeConstraints ที่ไม่บังคับสำหรับกำหนดพื้นที่ 3 มิติที่แอปจะแสดงผลเนื้อหาเชิงพื้นที่ได้ โดยค่าเริ่มต้น หากไม่ระบุข้อจำกัด พื้นที่ทำงานย่อยจะถูกจำกัดด้วยมุมมองปัจจุบันของSpatialUserในด้านความกว้างและความสูง ผู้ใช้ระบุข้อจำกัดที่จะใช้ได้หากไม่สามารถระบุมุมมองได้ ไม่เช่นนั้น ระบบจะใช้ค่าความกว้างและความสูงของมุมมองเริ่มต้น
  • เพิ่ม SpatialExternalSurface ซึ่งสามารถใช้เพื่อแสดงผลเนื้อหาภาพ 3 มิติ SpatialExternalSurface ปรับแต่งได้ด้วยตัวปรับเปลี่ยน (ยกเว้นอัลฟ่า) และเอฟเฟกต์การไล่ระดับขอบ
  • เพิ่มpointerHoverIconตัวแก้ไขพื้นที่ย่อยใหม่ซึ่งช่วยให้ผู้ใช้ตั้งค่าไอคอนสำหรับเคอร์เซอร์เชิงพื้นที่ได้

การเปลี่ยนแปลง API

  • นำข้อจำกัด RequiresApi(34) ออกสำหรับแพ็กเกจ Jetpack XR ทั้งหมด ข้อจำกัดนี้ไม่จำเป็นเนื่องจากปัจจุบัน Jetpack XR ใช้ได้เฉพาะในอุปกรณ์ที่มี API ระดับ 34 ขึ้นไปเท่านั้น (Iae0f8)
  • โปรเจ็กต์ที่เผยแพร่ด้วย Kotlin 2.0 ต้องใช้ KGP 2.0.0 ขึ้นไป (Idb6b5)
  • ตอนนี้การจัดการการกดกลับจะทำงานในแผงพื้นที่ทำงานที่ไม่มีกิจกรรมที่ฝังอยู่ หากต้องการให้การจัดการการกดกลับทำงาน คุณจะต้องระบุ android:enableOnBackInvokedCallback="true" ในไฟล์ Manifest ของ Android
  • ตอนนี้การจัดการการตอบกลับจะทำงานกับกล่องโต้ตอบเชิงพื้นที่ได้แล้ว หากต้องการให้การจัดการแบ็กโฮสต์ทำงาน คุณต้องระบุ android:enableOnBackInvokedCallback="true" ในไฟล์ Manifest ของ Android
  • ตอนนี้SpatialPanelที่อิงตามการเขียนและมุมมองจะปรับขนาดตามเนื้อหาได้แล้ว
  • ตอนนี้นักพัฒนาแอปสามารถกำหนดค่า SpatialElevationLevel ที่กำหนดเองของตนเองได้โดยไม่จำกัดเฉพาะระดับที่กำหนดไว้ล่วงหน้า
  • ตอนนี้คุณปรับแต่งระดับความสูงของวงโคจรผ่านพารามิเตอร์ elevation ได้แล้ว
  • ตอนนี้ พื้นที่ทำงานย่อยจะกําหนดขอบเขตตามความกว้างและความสูงของมุมมองของ SpatialUser โดยค่าเริ่มต้น หากไม่สามารถระบุมุมมองได้ ระบบจะใช้ค่าความกว้างและความสูงของมุมมองเริ่มต้น
  • เพิ่มการเรียกกลับใหม่ onMoveStart และ onMoveEnd ลงในตัวแก้ไข Movable ระบบจะเรียกใช้การเรียกกลับ onMoveStart และ onMoveEnd เมื่อผู้ใช้เริ่มและหยุดการย้ายพื้นที่ย่อยที่คอมโพสิเบิลด้วยตัวแก้ไขที่เคลื่อนย้ายได้
  • พารามิเตอร์ name ถูกนำออกจาก Spatial API เช่น SpatialRow และ SpatialPanel หากต้องการแก้ไขข้อบกพร่องของต้นไม้การคอมโพสิชันเชิงพื้นที่ ให้ใช้ SubspaceModifier.testTag แทน
  • นำโอเวอร์โหลดของ SpatialPopup ที่ไม่รองรับออก ซึ่งมีเพียง spatialElevationLevel และ content โปรดใช้อินเทอร์เฟซที่รองรับ onDimissRequest
  • นำการเรียกกลับ onPoseChange ออกจากตัวแก้ไขที่เคลื่อนย้ายได้ ให้ใช้ onMove แทน
  • SubspaceModifiers จะไม่มีผลอีกต่อไปหากมีการแยกออกหรือกำลังแยกออก
  • เราได้แยก SpatialRow API ที่มีอยู่ออกเป็น SpatialRow และ SpatialCurvedRow หากก่อนหน้านี้ใช้พารามิเตอร์ curveRadius ของ SpatialRow ให้ใช้ SpatialCurvedRow แทน ซึ่งมีลักษณะการทำงานเหมือนกัน
  • MainPanel และ ActivityPanel ไม่มีแถบชื่ออีกต่อไปเมื่อทำงานบนอิมเมจระบบล่าสุดที่คล้ายกัน
  • ตอนนี้ตัวแก้ไขอัลฟาและการปรับขนาดจะซ้อนกันได้ และจะคูณค่าของพวกมันเพื่อหาค่าอัลฟาหรือการปรับขนาดสุดท้ายที่ใช้
  • มีการปรับปรุงการเรียกกลับ onPoseChange จากตัวแก้ไขที่เคลื่อนย้ายได้เพื่อให้การเคลื่อนไหวของท่าทางราบรื่นขึ้น
  • ตอนนี้ตัวแก้ไขที่ย้ายได้และปรับขนาดได้จะเรียกใช้การเรียกกลับในเธรดหลักเพื่อให้แน่ใจว่าการเปลี่ยนแปลงสถานะจะทริกเกอร์การจัดองค์ประกอบใหม่
  • เพิ่มการสังเกตสถานะในเลย์เอาต์และระยะการวัดเพื่อให้แน่ใจว่าการเปลี่ยนแปลงสถานะใน SubspaceLayout จะทริกเกอร์การจัดเรียงใหม่
  • เพิ่มประสิทธิภาพการอัปเดตเชนตัวปรับเพื่อนำตัวปรับที่มีอยู่มาใช้ซ้ำได้ดียิ่งขึ้น

การแก้ไขข้อบกพร่อง

  • หยุดการปรับขนาดเมื่อ SpatialDialog แสดงขึ้น (Ic4594)
  • ระบบจะไม่สนใจคำขอจัดเรียงใหม่ซึ่งส่งขณะที่แยกโหนดตัวแก้ไขออก
  • นำระยะการปรับเปลี่ยนเลย์เอาต์ที่ทริกเกอร์โดยตัวปรับขนาดและตัวย้ายออกแล้ว
  • แก้ไขข้อขัดข้องในคอมโพสิชัน MainPanel() ที่เกิดขึ้นเมื่อตั้งค่ามิติข้อมูลเป็น 0 โดยตรงหรือระหว่างการคํานวณเลย์เอาต์ เช่น คํานวณ SpatialRow/SpatialColumn ตอนนี้แผงจะซ่อนอยู่แทน โปรดทราบว่าการแก้ไขนี้จัดการกับการขัดข้องในช่วงระยะการจัดวางโดยเฉพาะ ระบบจะจัดการการปรับขนาดแผงเป็น 0 ผ่านการโต้ตอบของผู้ใช้แยกต่างหาก แผงที่ซ่อนอยู่ไม่มีสิ่งอำนวยความสะดวกของ UI
  • แก้ไขปัญหาเกี่ยวกับ maintainAspectRatio จากตัวแก้ไขที่ปรับขนาดได้ ตอนนี้สัดส่วนภาพควรคงไว้เช่นเดิม
  • แก้ไขปัญหาเกี่ยวกับพื้นที่ทำงานย่อยที่ซ้อนกันซึ่งจะวางตำแหน่งไม่ถูกต้องสำหรับเฟรมเดียว
  • แก้ปัญหาที่บางครั้งระบบไม่ใช้มุมมนเมื่อควรจะใช้
  • NestedSubspaces จะไม่ปรากฏในเฟรมเดียวในตำแหน่งที่ไม่ถูกต้องอีกต่อไป

เวอร์ชัน 1.0.0-alpha03

26 กุมภาพันธ์ 2025

androidx.xr.compose:compose:1.0.0-alpha03 และ androidx.xr.compose:compose-testing:1.0.0-alpha03 เปิดตัวโดยไม่มีการเปลี่ยนแปลงที่โดดเด่นนับตั้งแต่รุ่นอัลฟ่าล่าสุด เวอร์ชัน 1.0.0-alpha03 มีการคอมมิตเหล่านี้

เวอร์ชัน 1.0.0-alpha02

12 กุมภาพันธ์ 2025

androidx.xr.compose:compose:1.0.0-alpha02 และ androidx.xr.compose:compose-testing:1.0.0-alpha02 เผยแพร่แล้ว เวอร์ชัน 1.0.0-alpha02 มีการคอมมิตเหล่านี้

ฟีเจอร์ใหม่

  • ตอนนี้แผงกิจกรรมสามารถบดบังเนื้อหาได้เมื่อเปิดใช้งานกล่องโต้ตอบเชิงพื้นที่
  • ตอนนี้ Orbiter API ใช้งานได้ในบริบท SubspaceComposable และจะแนบ Orbiter กับองค์ประกอบหลักแบบคอมโพสิเบิลที่อิงตาม SubspaceLayout ที่ใกล้ที่สุด
  • เปิดตัว LayoutCoordinatesAwareModifierNode เพื่ออนุญาตให้ใช้ตัวแก้ไขตามตำแหน่งที่กำหนดเอง
  • เพิ่มวิธีการแนบ/ถอดออกของวงจรชีวิตของ SubspaceModifier.Node
  • เพิ่ม scaleWithDistance ลงในตัวแก้ไขที่เคลื่อนย้ายได้ เมื่อเปิดใช้ scaleWithDistance องค์ประกอบย่อยที่ย้ายจะขยายหรือหดตัว และจะคงมาตราส่วนแบบชัดเจนที่มีก่อนการเคลื่อนไหวไว้ด้วย

การเปลี่ยนแปลง API

  • นำ SessionCallbackProvider ออกเพื่อใช้ SpatialCapabilities แทน

การเปลี่ยนแปลงอื่นๆ

  • ลดลงจาก minSDK เป็น 24 API ทั้งหมดของ Jetpack XR จะยังคงต้องใช้ API ระดับ 34 ที่รันไทม์ต่อไป
  • ตัวสร้าง Orbiter EdgeOffset.inner, EdgeOffset.outer และ EdgeOffset.overlap ไม่ได้เป็นเมธอด @Composable อีกต่อไป ซึ่งช่วยให้ใช้ตัวสร้างในบริบทที่คอมโพสิเบิลไม่ได้
  • อัปเดตระดับการยกระดับเชิงพื้นที่ให้ตรงกับข้อกำหนด UX ฉบับล่าสุด
  • ใช้อินเทอร์เฟซ SubspaceSemanticsInfo ใน MeasurableLayout
  • เปลี่ยนชื่อ SubspaceModifierElement เป็น SubspaceModifierNodeElement แล้ว

แก้ไขข้อบกพร่อง

  • การแก้ไขเพื่อเพิ่มความเสถียรในการสั่งซื้อ SubspaceModifier SubspaceModifier ควรทำงานได้อย่างน่าเชื่อถือมากขึ้น ตอนนี้คุณควรใช้ตัวควบคุมการปรับค่าต่างๆ เช่น การเลื่อน การหมุน การปรับขนาด ความสามารถในการย้าย และการปรับขนาดได้ ได้ตามลำดับที่ต้องการ

เวอร์ชัน 1.0.0-alpha01

12 ธันวาคม 2024

androidx.xr.compose:compose-*1.0.0-alpha01 ได้รับการปล่อยแล้ว

ฟีเจอร์ของรุ่นแรก

  • เวอร์ชันสำหรับนักพัฒนาแอปครั้งแรกของ Jetpack Compose สำหรับ XR ใช้แนวคิดที่คุ้นเคยของ Compose เช่น แถวและคอลัมน์เพื่อสร้างเลย์เอาต์ UI แบบพื้นที่ใน XR ไม่ว่าคุณจะพอร์ตแอป 2 มิติที่มีอยู่ไปยัง XR หรือสร้างแอป XR ใหม่ตั้งแต่ต้น ไลบรารีนี้มีองค์ประกอบย่อยและองค์ประกอบเชิงพื้นที่ เช่น แผงเชิงพื้นที่และออบิเตอร์ ซึ่งช่วยให้คุณวาง UI ของ Compose 2 มิติหรือ UI ที่อิงตาม Views ที่มีอยู่ลงในเลย์เอาต์เชิงพื้นที่ได้ ฟีเจอร์นี้เปิดตัวองค์ประกอบย่อยของ Volume ซึ่งช่วยให้คุณวางเอนทิตี SceneCore เช่น โมเดล 3 มิติ เทียบกับ UI ได้ ดูข้อมูลเพิ่มเติมในคู่มือนักพัฒนาซอฟต์แวร์นี้

    • Subspace: คอมโพสิชันนี้สามารถวางไว้ที่ใดก็ได้ภายในลําดับชั้น UI ของแอป ซึ่งช่วยให้คุณคงเลย์เอาต์สําหรับ UI 2 มิติและ UI เชิงพื้นที่ไว้ได้โดยไม่สูญเสียบริบทระหว่างไฟล์ วิธีนี้ช่วยให้แชร์สิ่งต่างๆ เช่น สถาปัตยกรรมแอปที่มีอยู่ระหว่าง XR กับอุปกรณ์รูปแบบอื่นๆ ได้ง่ายขึ้นโดยไม่ต้องยกสถานะผ่านทั้งต้นไม้ UI หรือปรับโครงสร้างแอปใหม่

    • SpatialPanel: แผงเชิงพื้นที่คือคอมโพสิชันย่อยที่ให้คุณแสดงเนื้อหาแอป เช่น คุณสามารถแสดงการเล่นวิดีโอ ภาพนิ่ง หรือเนื้อหาอื่นๆ ในแผงเชิงพื้นที่

    • Orbiter: Orbiter คือคอมโพเนนต์ UI เชิงพื้นที่ โดยออกแบบมาเพื่อแนบกับแผงพื้นที่ที่เกี่ยวข้อง และมีรายการการนำทางและรายการการดำเนินการตามบริบทที่เกี่ยวข้องกับแผงพื้นที่นั้น เช่น หากสร้างแผงเชิงพื้นที่เพื่อแสดงเนื้อหาวิดีโอ คุณสามารถเพิ่มตัวควบคุมการเล่นวิดีโอไว้ในวงโคจร

    • ปริมาตร: วางเอนทิตี SceneCore เช่น โมเดล 3 มิติ โดยสัมพันธ์กับ UI

  • เลย์เอาต์พื้นที่ทำงาน: คุณสร้างแผงพื้นที่ทำงานหลายรายการและวางไว้ในเลย์เอาต์พื้นที่ทำงานได้โดยใช้ SpatialRow, SpatialColumn, SpatialBox และ SpatialLayoutSpacer ใช้ SubspaceModifier เพื่อปรับแต่งเลย์เอาต์

  • คอมโพเนนต์ UI เชิงพื้นที่: คุณนําองค์ประกอบเหล่านี้มาใช้ซ้ำใน UI 2 มิติได้ และแอตทริบิวต์เชิงพื้นที่จะปรากฏขึ้นก็ต่อเมื่อเปิดใช้ความสามารถเชิงพื้นที่เท่านั้น

    • SpatialDialog: แผงจะดันกลับเล็กน้อยในเชิงลึกเพื่อแสดงกล่องโต้ตอบที่ยกระดับ
    • SpatialPopUp: แผงจะดันกลับเล็กน้อยใน Z-depth เพื่อแสดงป๊อปอัปที่ยกสูงขึ้น
    • SpatialElevation: SpatialElevationLevel สามารถตั้งค่าเพื่อเพิ่มระดับความสูงได้
  • SpatialCapabilities: ความสามารถเชิงพื้นที่อาจเปลี่ยนแปลงเมื่อผู้ใช้โต้ตอบกับแอปหรือระบบ หรือแอปของคุณเองก็อาจเปลี่ยนแปลงความสามารถเชิงพื้นที่ได้ เช่น การเปลี่ยนเป็นโหมดพื้นที่ในบ้านหรือพื้นที่เต็ม แอปของคุณต้องตรวจสอบ LocalSpatialCapabilities.current เพื่อดูว่าระบบรองรับ API ใดบ้างในสภาพแวดล้อมปัจจุบัน เพื่อหลีกเลี่ยงปัญหา isSpatialUiEnabled: องค์ประกอบ UI แบบ 3 มิติ (เช่น SpatialPanel) isContent3dEnabled: วัตถุ 3 มิติ isAppEnvironmentEnabled: สภาพแวดล้อม isPassthroughControlEnabled: แอปพลิเคชันควบคุมสถานะการส่งผ่านได้หรือไม่ isSpatialAudioEnabled: เสียงรอบทิศทาง

ปัญหาที่ทราบ

  • ปัจจุบันต้องใช้ minSDK 30 เพื่อใช้ Jetpack Compose สำหรับ XR วิธีแก้ปัญหาชั่วคราวคือเพิ่มรายการไฟล์ Manifest <uses-sdk tools:overrideLibrary="androidx.xr.scenecore, androidx.xr.compose"/> ต่อไปนี้เพื่อให้สามารถบิลด์และรันด้วย minSDK 23 ได้
  • ปัจจุบันแอป Jetpack XR ต้องขอสิทธิ์ android.permission.SCENE_UNDERSTANDING ใน AndroidManifest
  • เมื่อแอปเปิดในโหมดเต็มหน้าจอโดยตรงโดยใช้พร็อพเพอร์ตี้ PROPERTY_XR_ACTIVITY_START_MODE ในไฟล์ Manifest กิจกรรม/แอปพลิเคชันจะเปิดในโฮมสเปซก่อน จากนั้นจึงเปลี่ยนไปเป็นโหมดเต็มหน้าจอ
  • ในตอนแรก glTF ใน Volume Composables อาจกะพริบในตำแหน่งที่ไม่ถูกต้อง
  • การใช้ SpatialDialog ในแผงที่มีการย้ายไปมากจะดันเนื้อหาไปในทิศทางที่ไม่ถูกต้อง