Ekran kaleminin avuçla dokunma hareketlerini reddetme

Kullanıcılar ekran kalemi kullanarak çizim yaparken, yazarken veya bir uygulamayla etkileşimde bulunurken bazen ellerinin avuçlarıyla ekrana dokunur. Sistem, dokunma etkinliğini algılayıp yanlışlıkla avuçla dokunma olarak reddetmeden önce dokunma etkinliği uygulamanıza bildirilebilir.

Avuç içi dokunuşlarını belirleme ve yok sayma

Uygulamanız, alakasız dokunma etkinliklerini tanımlamalı ve yok saymalıdır. Android, uygulamanıza bir MotionEvent nesnesi göndererek avuç içi dokunuşunu iptal eder.

  • Uygulamanıza gönderilen MotionEvent nesnelerini inceleyin. Etkinlik özelliklerini (işlemler ve işaretler) belirlemek için MotionEvent API'lerini kullanın:

    • Tek işaretçili etkinlikler: ACTION_CANCEL değerini kontrol edin. Android 13 ve sonraki sürümlerde FLAG_CANCELED simgesini de kontrol edin.
    • Çoklu işaretçi etkinlikleri: Android 13 ve sonraki sürümlerde ACTION_POINTER_UP ve FLAG_CANCELED değerlerini kontrol edin.
  • ACTION_CANCEL ve ACTION_POINTER_UP/FLAG_CANCELED özelliklerine sahip hareket etkinliklerini yoksayabilirsiniz.

1. Hareket etkinliği nesnelerini edinme

Uygulamanıza bir OnTouchListener ekleyin:

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

Tüm API düzeylerinde tek işaretçili bir etkinliği gösteren ACTION_CANCEL değerini kontrol edin. Android 13 ve sonraki sürümlerde FLAG_CANCELED. için ACTION_POINTER_UP'ü kontrol edin

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

Avuç dokunuşunu tespit ettikten sonra hareketin ekrandaki efektlerini geri alabilirsiniz.

Avuç içi dokunuşları gibi istenmeyen girişlerin geri alınabilmesi için uygulamanız kullanıcı işlemlerinin geçmişini tutmalıdır. Geçmişin nasıl tutulacağına dair bir örnek için Android uygulamasında ekran kalemi desteğini geliştirme codelab'indeki Temel bir çizim uygulaması uygulama bölümüne bakın.

Önemli noktalar

  • MotionEvent: Dokunma ve hareket etkinliklerini temsil eder. Bir etkinliğin dikkate alınmayıp alınmaması gerektiğini belirlemek için gerekli bilgileri içerir.
  • OnTouchListener#onTouch(): MotionEvent nesnesi alır.
  • MotionEvent#getActionMasked(): Hareket etkinliğiyle ilişkili işlemi döndürür.
  • ACTION_CANCEL: Bir hareketin geri alınması gerektiğini belirten MotionEvent sabit.
  • ACTION_POINTER_UP: İlk işaretçi dışında bir işaretçinin yukarı gittiğini (yani cihaz ekranıyla temasını kaybettiğini) belirten MotionEvent sabit.
  • FLAG_CANCELED: İşaretçinin yukarı doğru hareket etmesinin istenmeyen bir dokunma etkinliğine neden olduğunu belirten MotionEvent sabit. Android 13 (API düzeyi 33) ve sonraki sürümlerdeki ACTION_POINTER_UP ve ACTION_CANCEL etkinliklerine eklendi.

Sonuçlar

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

Bu kılavuzu içeren koleksiyonlar

Bu kılavuz, daha geniş Android geliştirme hedeflerini kapsayan, özel olarak seçilmiş Hızlı Kılavuz koleksiyonlarından biridir:

Uygulamanızın tabletler, katlanabilir cihazlar ve ChromeOS cihazlarda optimize edilmiş bir kullanıcı deneyimi sunmasını sağlayın.

Sorularınız veya geri bildiriminiz mi var?

Sık sorulan sorular sayfamıza giderek kısa kılavuzlar hakkında bilgi edinebilir veya bize ulaşarak düşüncelerinizi bizimle paylaşabilirsiniz.