Ekran kaleminin avuçla dokunma hareketlerini reddetme

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.

Uygulamanız, gereksiz dokunma etkinliklerini tanımlamalı ve bunları yoksaymalıdır. Android 13 ve daha yüksek API düzeyleri, avuç içiyle dokunmaları diğer tüm API düzeylerinden farklı şekilde gösterir.

Sonuçlar

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

Avuç içi dokunuşlarını tanımlama ve yoksayma

Android, uygulamanıza bir MotionEvent nesnesi göndererek avuç içiyle dokunma işlemini iptal eder.

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

    • Tek işaretçili etkinlikler: ACTION_CANCEL olup olmadığını 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 öğelerini kontrol edin.
  • ACTION_CANCEL ve ACTION_POINTER_UP/FLAG_CANCELED özelliklerine sahip hareket etkinliklerini yoksayın.

1. Hareket etkinliği nesnelerini edinme

Uygulamanıza OnTouchListener ekleme:

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 simgesini arayın. Android 13 ve sonraki sürümlerde ACTION_POINTER_UP için FLAG_CANCELED. simgesini 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ç içiyle dokunmayı belirledikten sonra 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. Geçmişin nasıl korunacağına dair bir örnek için Android uygulamasında kalem desteğini geliştirme codelab'indeki Temel bir çizim uygulaması oluşturma bölümüne bakın.

Önemli noktalar

  • MotionEvent: Dokunma ve hareket etkinliklerini gösterir. Bir etkinliğin göz ardı edilip edilmeyeceğini belirlemek için gerekli bilgileri içerir.
  • OnTouchListener#onTouch(): MotionEvent nesnelerini alır.
  • MotionEvent#getActionMasked(): Bir hareket etkinliğiyle ilişkili işlemi döndürür.
  • ACTION_CANCEL: Bir hareketin geri alınması gerektiğini belirten MotionEvent sabiti.
  • 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.

Bu kılavuzu içeren koleksiyonlar

Bu kılavuz, daha geniş Android geliştirme hedeflerini kapsayan şu seçilmiş Hızlı Kılavuz koleksiyonlarının bir parçasıdır:

Uygulamanızın tabletlerde, katlanabilir cihazlarda ve ChromeOS cihazlarda optimize edilmiş bir kullanıcı deneyimini desteklemesini sağlayın.

Sorularınız veya geri bildiriminiz mi var?

Sık sorulan sorular sayfamıza giderek hızlı kılavuzlar hakkında bilgi edinebilir veya düşüncelerinizi bize iletebilirsiniz.