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:
- Eine maskierte Aktion wie
ACTION_DOWN,ACTION_MOVEoderACTION_UP. - Zeigerkoordinaten wie
AXIS_X,AXIS_YoderAXIS_Z. - Geräte- und Quellinformationen wie die Geräte-ID und die Quelle.
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:
- Weitere Informationen zur UI-Eingabe finden Sie unter Fokus in Jetpack Compose Glimmer und Indirekte Zeigereingaben verarbeiten.
- Informationen zu projizierten Eingabeereignissen finden Sie unter
ProjectedActivityCompat,ProjectedInputEventundProjectedInputEvent.ProjectedInputAction. - Informationen zur Plattformeingabe und -navigation finden Sie unter
MotionEventund Benutzerdefinierte Zurück-Navigation bereitstellen.