Menolak sentuhan telapak tangan stilus

Saat menggambar, menulis, atau berinteraksi dengan aplikasi menggunakan stilus, terkadang pengguna menyentuh layar dengan telapak tangan mereka. Peristiwa sentuh mungkin dilaporkan ke aplikasi Anda sebelum sistem mengenali dan menolak peristiwa sebagai sentuhan telapak tangan yang tidak disengaja.

Aplikasi Anda harus mengidentifikasi peristiwa sentuh yang tidak relevan dan mengabaikannya. Android 13 dan level API yang lebih tinggi menunjukkan sentuhan telapak tangan secara berbeda dari semua level API lainnya.

Hasil

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

Mengidentifikasi dan mengabaikan sentuhan telapak tangan

Android membatalkan sentuhan telapak tangan dengan mengirim objek MotionEvent ke aplikasi Anda.

  • Periksa objek MotionEvent yang dikirim ke aplikasi Anda. Gunakan MotionEvent API untuk menentukan properti peristiwa (tindakan dan tanda):

    • Peristiwa pointer tunggal — Periksa ACTION_CANCEL. Di Android 13 dan yang lebih tinggi, periksa juga FLAG_CANCELED.
    • Peristiwa multi-pointer — Di Android 13 dan yang lebih tinggi, periksa ACTION_POINTER_UP dan FLAG_CANCELED.
  • Mengabaikan peristiwa gerakan yang memiliki properti ACTION_CANCEL dan ACTION_POINTER_UP/FLAG_CANCELED.

1. Mendapatkan objek peristiwa gerakan

Tambahkan OnTouchListener ke aplikasi Anda:

Kotlin

val myView = findViewById<View>(R.id.myView).apply {
    setOnTouchListener { view, event ->
        // Process motion event.
    }
}

Java

View myView = findViewById(R.id.myView);
myView.setOnTouchListener( (view, event) -> {
    // Process motion event.
});

2. Menentukan tindakan dan tanda peristiwa

Periksa ACTION_CANCEL, yang menunjukkan peristiwa pointer tunggal di semua level API. Di Android 13 dan yang lebih baru, lihat ACTION_POINTER_UP untuk FLAG_CANCELED.

Kotlin

val myView = findViewById<View>(R.id.myView).apply {
    setOnTouchListener { view, event ->
        when (event.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 &&
                   (event.flags and MotionEvent.FLAG_CANCELED) == MotionEvent.FLAG_CANCELED) {
                    //Process canceled multi-pointer motion event for Android 13 and higher.
                }
            }
        }
        true
    }
}

Java

View myView = findViewById(R.id.myView);
myView.setOnTouchListener( (view, event) -> {
    switch (event.getActionMasked()) {
        case MotionEvent.ACTION_CANCEL:
            // Process canceled single-pointer motion event for all SDK versions.
        case MotionEvent.ACTION_UP:
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
               (event.getFlags() & MotionEvent.FLAG_CANCELED) == MotionEvent.FLAG_CANCELED) {
                //Process canceled multi-pointer motion event for Android 13 and higher.
            }
    }
    return true;
});

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. Untuk contoh cara mempertahankan histori, lihat Mengimplementasikan aplikasi gambar dasar di codelab Meningkatkan dukungan stilus di aplikasi Android.

Poin utama

  • MotionEvent: Mewakili peristiwa sentuh dan gerakan. Berisi informasi yang diperlukan untuk menentukan apakah suatu peristiwa harus diabaikan.
  • OnTouchListener#onTouch(): Menerima objek MotionEvent.
  • MotionEvent#getActionMasked(): Menampilkan tindakan yang terkait dengan peristiwa gerakan.
  • ACTION_CANCEL: Konstanta MotionEvent yang menunjukkan gestur harus diurungkan.
  • 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. Ditambahkan ke peristiwa ACTION_POINTER_UP dan ACTION_CANCEL di Android 13 (level API 33) dan yang lebih tinggi.

Koleksi yang berisi panduan ini

Panduan ini adalah bagian dari koleksi Panduan Cepat pilihan yang mencakup tujuan pengembangan Android yang lebih luas:

Aktifkan aplikasi Anda untuk mendukung pengalaman pengguna yang dioptimalkan di tablet, perangkat foldable, dan perangkat ChromeOS.

Ada pertanyaan atau masukan?

Buka halaman pertanyaan umum (FAQ) kami dan pelajari panduan singkat atau hubungi kami dan sampaikan pendapat Anda.