จัดการอินพุตทางกายภาพจากแว่นตาที่มีระบบเสียงและแว่นตาที่มีจอแสดงผล

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

หากต้องการบันทึกและประมวลผลข้อมูลที่ผู้ใช้ป้อนซึ่งส่งไปยังกิจกรรมที่แสดงผล ของแอป หรือหากต้องการใช้ลักษณะการทำงานของทัชแพดที่กำหนดเอง ให้ใช้ข้อมูลจากตัวชี้ทางอ้อม หากต้องการจัดการเหตุการณ์ประเภทอื่นๆ (เช่น การดำเนินการของกล้อง) โปรดดูส่วนต่อไปนี้ในคู่มือนี้

จัดการการดำเนินการของกล้อง

เมื่อใดก็ตามที่ผู้ใช้กดปุ่มกล้องของอุปกรณ์ ระบบจะส่งอินพุต เหตุการณ์ไปยังกิจกรรมที่แสดงผลของแอปเป็นการดำเนินการ ProjectedInputEvent.ProjectedInputAction.TOGGLE_APP_CAMERA แอปของคุณสามารถสังเกตการดำเนินการนี้ได้โดยใช้ตัวส่งสัญญาณเฉพาะ ดังนี้

@OptIn(ExperimentalProjectedApi::class)
class CameraActionInputSnippetActivity : ComponentActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // Observe hardware camera action events when RESUMED
        lifecycleScope.launch {
            repeatOnLifecycle(Lifecycle.State.RESUMED) {
                withContext(Dispatchers.Default) {
                    try {
                        val projectedActivity = ProjectedActivityCompat.create(this@CameraActionInputSnippetActivity)
                        try {
                            projectedActivity.projectedInputEvents.collect { inputEvent ->
                                if (inputEvent.inputAction == TOGGLE_APP_CAMERA) {
                                    withContext(Dispatchers.Main) {
                                        onCameraActionTriggered()
                                    }
                                }
                            }
                        } finally {
                            projectedActivity.close()
                        }
                    } catch (e: CancellationException) {
                        throw e
                    } catch (e: Exception) {
                        Log.w("CameraActionSnippet", "ProjectedActivityCompat unavailable: ${e.message}")
                    }
                }
            }
        }

        setContent {
            GlimmerTheme {
                TouchpadInputSnippet(
                    onTap = { Log.i("CameraActionSnippet", "Touchpad tapped") }
                )
            }
        }
    }

    private fun onCameraActionTriggered() {
        Log.i("CameraActionSnippet", "Camera action button double-pressed!")
    }
}

ตรวจสอบเหตุการณ์การเคลื่อนไหวทั่วไป

ใช้ dispatchGenericMotionEvent เพื่อตรวจสอบเหตุการณ์การเคลื่อนไหวทั่วไปที่ส่ง ไปยังกิจกรรมที่แสดงผลของแอป เหตุการณ์การเคลื่อนไหวทั่วไปจะส่งที่ขอบเขตของกิจกรรมและไม่จำเป็นต้องมีคอมโพเนนต์ Jetpack Compose Glimmer ที่โฟกัส

MotionEvent อาจมีข้อมูลต่อไปนี้

ไม่ใช่ทุกค่าที่จะมีความหมายสำหรับการดำเนินการทุกอย่าง ตรวจสอบการดำเนินการและแหล่งที่มาก่อนที่จะถือว่าเหตุการณ์ดิบเป็นท่าทางสัมผัสที่เสร็จสมบูรณ์

class MotionGestureInputSnippetActivity : ComponentActivity() {

    override fun dispatchGenericMotionEvent(ev: MotionEvent): Boolean {
        val actionName = when (ev.actionMasked) {
            MotionEvent.ACTION_DOWN -> "ACTION_DOWN" // First contact with the glasses touchpad
            MotionEvent.ACTION_MOVE -> "ACTION_MOVE" // Contact moving across the glasses touchpad
            MotionEvent.ACTION_UP -> "ACTION_UP"     // Contact lifted from the glasses touchpad
            else -> "ACTION_${ev.actionMasked}"
        }

        Log.d(
            "MotionGestureSnippet",
            "MotionEvent: action=$actionName x=${ev.x} y=${ev.y}"
        )

        // Delegate to super unless intentionally consuming the event
        return super.dispatchGenericMotionEvent(ev)
    }
}

ส่งคืน true ก็ต่อเมื่อกิจกรรมใช้เหตุการณ์โดยเจตนา มิฉะนั้น ให้ส่งคืน super.dispatchGenericMotionEvent(ev) เพื่อให้เหตุการณ์ดำเนินการต่อผ่านการส่งสัญญาณตามปกติ

จัดการท่าทางสัมผัสย้อนกลับของระบบ

เมื่อหน้าจอต้องการลักษณะการทำงานย้อนกลับที่กำหนดเอง แอปของคุณควรจัดการท่าทางสัมผัสย้อนกลับของแว่นตา โดยใช้ Android API เดียวกันกับที่ใช้สำหรับกิจกรรมอื่นๆ เช่น OnBackPressedDispatcher และ OnBackPressedCallback

ท่าทางผู้ใช้จะขึ้นอยู่กับประเภทแว่นตา ดังนี้

  • ในแว่นตาที่มีจอแสดงผล การปัดลงบนทัชแพดจะทำท่าทางสัมผัสย้อนกลับของระบบ
  • ในแว่นตาที่มีระบบเสียง การปัดกลับบนทัชแพดจะทำท่าทางสัมผัสย้อนกลับของระบบ

ลงทะเบียนการเรียกกลับย้อนกลับเมื่อหน้าจอปัจจุบันต้องสกัดกั้นการย้อนกลับ เช่น การปิดการวางซ้อนหรือการแสดงการยืนยันการออก

class BackGestureInputSnippetActivity : ComponentActivity() {

    private val backCallback = object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
            onBackGestureReceived()
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // Register back gesture callback with Activity's onBackPressedDispatcher
        onBackPressedDispatcher.addCallback(this, backCallback)
    }

    private fun onBackGestureReceived() {
        Log.i("BackGestureSnippet", "System back gesture intercepted")
    }
}

ควรเปิดใช้การเรียกกลับก็ต่อเมื่อหน้าจอที่ใช้งานอยู่ควรสกัดกั้นการย้อนกลับ ปิดใช้หรือนำการเรียกกลับออกเมื่อลักษณะการทำงานเริ่มต้นของระบบหรือการนำทางควรจัดการการย้อนกลับ

ขั้นตอนถัดไป

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