Penolakan telapak tangan stilus

Ikon rating bintang lima

Stilus dapat menjadi alat yang sangat produktif dan kreatif. Namun, saat menggambar, menulis, atau berinteraksi dengan aplikasi menggunakan stilus, terkadang pengguna menyentuh layar dengan telapak tangan mereka. Peristiwa sentuh dapat dilaporkan ke aplikasi Anda sebelum sistem mengenali dan menolak peristiwa sebagai sentuhan telapak tangan yang tidak disengaja.

Praktik terbaik

Aplikasi Anda harus mengidentifikasi peristiwa sentuh yang tidak relevan dan mengabaikannya. Di Jetpack Compose, Anda dapat mengakses MotionEvent Android yang mendasarinya dari a PointerEvent. Periksa MotionEvent untuk ACTION_CANCEL, yang menunjukkan bahwa gestur harus berhenti dan mungkin perlu di-roll back. Di Android 13 (level API 33) dan yang lebih tinggi, periksa tanda FLAG_CANCELED pada peristiwa ACTION_CANCEL dan ACTION_POINTER_UP, yang memberikan sinyal kuat bahwa sentuhan tersebut tidak disengaja, seperti sentuhan telapak tangan.

Bahan

  • Modifier.pointerInput(): Pengubah Compose yang digunakan untuk memproses input pointer.
  • PointerEvent: Mewakili peristiwa pointer di Compose, yang berisi satu atau beberapa perubahan.
  • PointerEvent.motionEvent: Properti ekstensi yang menyediakan akses ke MotionEvent Android yang mendasarinya (dapat diisi dengan nilai null).
  • MotionEvent: Mewakili peristiwa sentuh dan gerakan. Berisi informasi yang diperlukan untuk menentukan apakah suatu peristiwa harus diabaikan.
  • ACTION_CANCEL: Konstanta MotionEvent yang menunjukkan bahwa gestur telah dibatalkan; gestur harus berhenti dan mungkin perlu di-roll back.
  • ACTION_POINTER_UP: Konstanta MotionEvent yang menunjukkan pointer selain pointer pertama telah naik (yaitu, telah melepaskan kontak dengan layar perangkat).
  • FLAG_CANCELED: Konstanta MotionEvent yang menunjukkan bahwa pointer naik menyebabkan peristiwa sentuh yang tidak disengaja. Menambahkan peristiwa ACTION_POINTER_UP dan ACTION_CANCEL di Android 13 (level API 33) dan versi yang lebih baru.

Langkah

Periksa objek MotionEvent yang dikirim ke aplikasi Anda. Gunakan MotionEvent API untuk menentukan karakteristik peristiwa:

  • Peristiwa pointer tunggal — Periksa ACTION_CANCEL, yang menunjukkan bahwa gestur harus berhenti. Di Android 13 dan yang lebih tinggi, periksa juga FLAG_CANCELED untuk mengonfirmasi bahwa sentuhan tersebut tidak disengaja.
  • Peristiwa multi-pointer — Di Android 13 dan yang lebih tinggi, periksa ACTION_POINTER_UP dan FLAG_CANCELED untuk mengidentifikasi sentuhan yang tidak disengaja.

Respons terhadap peristiwa ini dengan menghentikan gestur dan mengembalikan perubahan sementara.

1. Mendapatkan objek peristiwa gerakan

Gunakan Modifier.pointerInput untuk memproses input pointer pada Composable. Dalam cakupan input pointer, gunakan awaitPointerEventScope dan awaitPointerEvent untuk menerima peristiwa, dan mengambil MotionEvent Android yang mendasarinya menggunakan properti motionEvent:

import androidx.compose.ui.input.pointer.pointerInput
    Box(
        modifier = Modifier
            .fillMaxSize()
            .pointerInput(Unit) {
                awaitPointerEventScope {
                    while (true) {
                        val event = awaitPointerEvent()
                        val motionEvent = event.motionEvent
                        if (motionEvent != null) {
                            // Process motion event.
                        }
                    }
                }
            }
    )

2. Menentukan tindakan dan tanda peristiwa

Periksa MotionEvent untuk ACTION_CANCEL, yang menunjukkan peristiwa pointer tunggal di semua level API. Di Android 13 dan yang lebih tinggi, periksa ACTION_POINTER_UP untuk FLAG_CANCELED:

import androidx.compose.ui.input.pointer.pointerInput
    Box(
        modifier = Modifier
            .fillMaxSize()
            .pointerInput(Unit) {
                awaitPointerEventScope {
                    while (true) {
                        val event = awaitPointerEvent()
                        val motionEvent = event.motionEvent ?: continue

                        when (motionEvent.actionMasked) {
                            MotionEvent.ACTION_CANCEL -> {
                                // Process canceled single-pointer motion event for all SDK versions.
                            }
                            MotionEvent.ACTION_POINTER_UP -> {
                                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
                                    (motionEvent.flags and MotionEvent.FLAG_CANCELED) == MotionEvent.FLAG_CANCELED
                                ) {
                                    // Process canceled multi-pointer motion event for Android 13 and higher.
                                }
                            }
                        }
                    }
                }
            }
    )

3. Mengurungkan gestur

Setelah mengidentifikasi sentuhan telapak tangan, Anda dapat mengurungkan efek gestur di layar.

Aplikasi Anda harus menyimpan histori tindakan pengguna sehingga input yang tidak disengaja seperti sentuhan telapak tangan dapat diurungkan. Lihat Mengimplementasikan aplikasi gambar dasar di codelab Meningkatkan dukungan stilus di aplikasi Android untuk mengetahui contohnya.

Hasil

Aplikasi Anda kini dapat mengidentifikasi dan menolak sentuhan telapak tangan untuk peristiwa multi-pointer di Android 13 dan level API yang lebih tinggi, serta untuk peristiwa pointer tunggal di semua level API.

Referensi lainnya

Untuk informasi selengkapnya, lihat referensi berikut: