Physische Eingabe über Audio- und Display-Brillen verarbeiten

XR‑Geräte, für die der Leitfaden gilt
Dieser Leitfaden hilft Ihnen dabei, Erlebnisse für die folgenden Arten von XR-Geräten zu entwickeln.
Audio- und
Displaybrillen

Wenn Sie Nutzereingaben erfassen und verarbeiten möchten, die an die projizierte Aktivität Ihrer App gesendet werden, oder benutzerdefinierte Touchpad-Verhaltensweisen implementieren möchten, verwenden Sie indirekte Zeiger eingaben. Informationen zur Verarbeitung anderer Ereignistypen (z. B. der Kameraaktion) finden Sie in den folgenden Abschnitten dieses Leitfadens.

Kameraaktion verarbeiten

Wenn ein Nutzer die Kamerataste eines Geräts drückt, sendet das System ein Eingabe ereignis als ProjectedInputEvent.ProjectedInputAction.TOGGLE_APP_CAMERA-Aktion an die projizierte Aktivität Ihrer App. Ihre App kann diese Aktion mit einem speziellen Dispatcher beobachten:

@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!")
    }
}

Allgemeine Bewegungsereignisse prüfen

Mit dispatchGenericMotionEvent können Sie allgemeine Bewegungsereignisse prüfen, die an die projizierte Aktivität Ihrer App gesendet werden. Allgemeine Bewegungsereignisse werden an der Aktivitätsgrenze gesendet und erfordern keine fokussierte Jetpack Compose Glimmer-Komponente.

Ein MotionEvent kann Folgendes enthalten:

Nicht jeder Wert ist für jede Aktion sinnvoll. Prüfen Sie die Aktion und die Quelle, bevor Sie ein Rohereignis als abgeschlossene Geste behandeln.

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

Geben Sie nur dann true zurück, wenn die Aktivität das Ereignis absichtlich verarbeitet. Andernfalls geben Sie super.dispatchGenericMotionEvent(ev) zurück, damit das Ereignis normal weitergeleitet werden kann.

Systemgeste „Zurück“ verarbeiten

Wenn für einen Bildschirm ein benutzerdefiniertes Verhalten für die Zurück-Geste erforderlich ist, sollte Ihre App die Zurück-Geste der Brille mit denselben Android-APIs verarbeiten, die Sie für andere Aktivitäten verwenden, z. B. OnBackPressedDispatcher und OnBackPressedCallback.

Die Nutzergeste hängt vom Brillentyp ab:

  • Bei Displaybrillen wird die Systemgeste „Zurück“ durch Wischen auf dem Touchpad nach unten ausgeführt.
  • Bei Audiobrillen wird die Systemgeste „Zurück“ durch Wischen auf dem Touchpad nach hinten ausgeführt.

Registrieren Sie einen Rückruf für die Zurück-Geste, wenn der aktuelle Bildschirm die Zurück-Geste abfangen muss, z. B. um ein Overlay zu schließen oder eine Bestätigung zum Beenden anzuzeigen.

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")
    }
}

Der Rückruf sollte nur aktiviert werden, wenn der aktive Bildschirm die Zurück-Geste abfangen soll. Deaktivieren oder entfernen Sie den Rückruf, wenn die Zurück-Geste vom Standardverhalten des Systems oder der Navigation verarbeitet werden soll.

Nächste Schritte

Nachdem Sie die Eingabeverarbeitung für diese Ereignisse implementiert haben, finden Sie in den folgenden Themen weitere Informationen zur Verarbeitung anderer Arten von Eingabeereignissen: