Untuk merekam dan memproses input pengguna yang dikirimkan ke aktivitas yang diproyeksikan aplikasi Anda, atau untuk menerapkan perilaku touchpad kustom, gunakan input pointer tidak langsung. Untuk menangani jenis peristiwa lainnya (seperti tindakan kamera), lihat bagian berikut dalam panduan ini.
Menangani tindakan kamera
Setiap kali pengguna menekan tombol kamera perangkat, sistem akan mengirimkan peristiwa input ke aktivitas yang diproyeksikan aplikasi Anda sebagai tindakan ProjectedInputEvent.ProjectedInputAction.TOGGLE_APP_CAMERA. Aplikasi Anda dapat mengamati tindakan ini menggunakan dispatcher khusus:
@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!") } }
Memeriksa peristiwa gerakan umum
Gunakan dispatchGenericMotionEvent untuk memeriksa peristiwa gerakan umum yang dikirimkan ke aktivitas yang diproyeksikan aplikasi Anda. Peristiwa gerakan generik dikirimkan di batas aktivitas dan tidak memerlukan komponen Jetpack Compose Glimmer yang difokuskan.
MotionEvent dapat mencakup:
- Tindakan yang disamarkan, seperti
ACTION_DOWN,ACTION_MOVE, atauACTION_UP. - Koordinat pointer, seperti
AXIS_X,AXIS_Y, atauAXIS_Z. - Informasi perangkat dan sumber, seperti ID perangkat dan sumber.
Tidak semua nilai bermakna untuk setiap tindakan. Periksa tindakan dan sumber sebelum memperlakukan peristiwa mentah sebagai gestur yang telah selesai.
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) } }
Menampilkan true hanya saat aktivitas sengaja menggunakan peristiwa.
Jika tidak, kembalikan super.dispatchGenericMotionEvent(ev) agar peristiwa dapat
berlanjut melalui pengiriman normal.
Menangani gestur Kembali sistem
Saat layar memerlukan perilaku kembali kustom, aplikasi Anda harus menangani gestur Kembali kacamata menggunakan API Android yang sama dengan yang Anda gunakan untuk aktivitas lain, seperti OnBackPressedDispatcher dan OnBackPressedCallback.
Gestur pengguna bergantung pada jenis kacamata:
- Pada kacamata tampilan, menggeser ke bawah pada touchpad akan melakukan gestur Kembali sistem.
- Pada kacamata pintar audio, menggeser ke belakang di touchpad akan melakukan gestur Kembali sistem.
Mendaftarkan callback kembali saat layar saat ini perlu mencegat Kembali, seperti menutup overlay atau menampilkan konfirmasi keluar.
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") } }
Callback hanya boleh diaktifkan saat layar aktif harus mencegat Kembali. Nonaktifkan atau hapus callback saat perilaku sistem atau navigasi default harus menangani Kembali.
Langkah berikutnya
Setelah menerapkan penanganan input untuk peristiwa ini, Anda dapat mempelajari lebih lanjut cara menangani jenis peristiwa input lainnya dalam topik berikut:
- Untuk mengetahui informasi selengkapnya tentang input UI, lihat Kilau Fokus di Jetpack Compose dan Menangani input pointer tidak langsung.
- Untuk peristiwa input yang diproyeksikan, lihat
ProjectedActivityCompat,ProjectedInputEvent, danProjectedInputEvent.ProjectedInputAction. - Untuk input dan navigasi platform, lihat
MotionEventdan Menyediakan navigasi kembali kustom.