Ekran kalemiyle avuç içi reddi

Beş yıldızlı değerlendirme simgesi

Stylus, son derece üretken ve yaratıcı bir araç olabilir. Ancak kullanıcılar ekran kalemiyle çizim yaparken, yazarken veya bir uygulamayla etkileşimde bulunurken bazen avuçlarıyla ekrana dokunur. Dokunma etkinliği, sistem etkinliği yanlışlıkla avuç içiyle dokunma olarak tanıyıp kapatmadan önce uygulamanıza bildirilebilir.

En iyi uygulamalar

Uygulamanız, gereksiz dokunma etkinliklerini tanımlamalı ve bunları yoksaymalıdır. Jetpack Compose'da, MotionEvent temel Android'ine PointerEvent üzerinden erişebilirsiniz. ACTION_CANCEL için MotionEvent simgesini kontrol edin. Bu simge, bir hareketin durdurulması gerektiğini ve geri alınması gerekebileceğini gösterir. Android 13 (API düzeyi 33) ve sonraki sürümlerde, FLAG_CANCELED işaretini ACTION_CANCEL ve ACTION_POINTER_UP etkinliklerinde kontrol edin. Bu işaret, dokunmanın avuç içiyle dokunma gibi istenmeden yapıldığını gösteren güçlü bir sinyal sağlar.

Malzemeler

  • Modifier.pointerInput(): İşaretçi girişini işlemek için kullanılan Compose değiştiricisi.
  • PointerEvent: Compose'da bir veya daha fazla değişiklik içeren bir işaretçi etkinliğini temsil eder.
  • PointerEvent.motionEvent: Temel Android MotionEvent'e erişim sağlayan uzantı özelliği (null olabilir).
  • MotionEvent: Dokunma ve hareket etkinliklerini gösterir. Bir etkinliğin göz ardı edilip edilmeyeceğini belirlemek için gerekli bilgileri içerir.
  • ACTION_CANCEL: Bir hareketin iptal edildiğini belirten MotionEvent sabiti. Hareket durdurulmalı ve geri alınması gerekebilir.
  • ACTION_POINTER_UP: İlk işaretçi dışındaki bir işaretçinin yukarı çıktığını (yani cihaz ekranıyla teması bıraktığını) gösteren MotionEvent sabiti.
  • FLAG_CANCELED: İşaretçinin yukarı gitmesinin, istenmeyen bir dokunma etkinliğine neden olduğunu belirten MotionEvent sabiti. Android 13 (API düzeyi 33) ve sonraki sürümlerdeki ACTION_POINTER_UP ve ACTION_CANCEL etkinliklerine eklendi.

Adımlar

Uygulamanıza gönderilen MotionEvent nesnelerini inceleyin. Etkinlik özelliklerini belirlemek için MotionEvent API'lerini kullanın:

  • Tek parmakla yapılan etkinlikler: Hareketin durdurulması gerektiğini belirten ACTION_CANCEL işaretini kontrol edin. Android 13 ve sonraki sürümlerde, dokunmanın yanlışlıkla yapıldığını onaylamak için FLAG_CANCELED simgesini de kontrol edin.
  • Çoklu dokunma etkinlikleri: Android 13 ve sonraki sürümlerde, yanlışlıkla dokunmaları belirlemek için ACTION_POINTER_UP ve FLAG_CANCELED simgelerini kontrol edin.

Bu etkinliklere, hareketi durdurup geçici değişiklikleri geri alarak yanıt verin.

1. Hareket etkinliği nesneleri edinme

Bir Composable'da işaretçi girişini işlemek için Modifier.pointerInput kullanın. İşaretçi girişi kapsamı içinde, etkinlikleri almak için awaitPointerEventScope ve awaitPointerEvent öğelerini kullanın ve motionEvent özelliğini kullanarak temel alınan Android MotionEvent öğesini alın:

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. Etkinlik işlemini ve işaretlerini belirleme

Tüm API düzeylerinde tek işaretçili bir etkinliği gösteren ACTION_CANCEL için MotionEvent öğesini kontrol edin. Android 13 ve sonraki sürümlerde ACTION_POINTER_UPFLAG_CANCELED için şunları kontrol edin:

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. Hareketi geri alma

Avuç içiyle dokunma hareketini tespit ettikten sonra bu hareketin ekrandaki etkilerini geri alabilirsiniz.

Uygulamanız, kullanıcı işlemlerinin geçmişini tutmalıdır. Böylece, avuç içiyle dokunma gibi istenmeyen girişler geri alınabilir. Örnek için Android uygulamasında ekran kalemi desteğini geliştirme codelab'indeki Temel bir çizim uygulaması oluşturma bölümüne bakın.

Sonuçlar

Uygulamanız artık Android 13 ve sonraki API düzeylerinde çoklu işaretçi etkinlikleri, tüm API düzeylerinde ise tek işaretçi etkinlikleri için avuç içi dokunuşlarını tanımlayıp reddedebilir.

Ek kaynaklar

Daha fazla bilgi için aşağıdaki kaynaklara bakın: