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çinMotionEvent
API'lerini kullanın:- Tek işaretçili etkinlikler:
ACTION_CANCEL
değerini kontrol edin. Android 13 ve sonraki sürümlerdeFLAG_CANCELED
simgesini de kontrol edin. - Çoklu işaretçi etkinlikleri: Android 13 ve sonraki sürümlerde
ACTION_POINTER_UP
veFLAG_CANCELED
değerlerini kontrol edin.
- Tek işaretçili etkinlikler:
ACTION_CANCEL
veACTION_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 belirtenMotionEvent
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) belirtenMotionEvent
sabit.FLAG_CANCELED
: İşaretçinin yukarı doğru hareket etmesinin istenmeyen bir dokunma etkinliğine neden olduğunu belirtenMotionEvent
sabit. Android 13 (API düzeyi 33) ve sonraki sürümlerdekiACTION_POINTER_UP
veACTION_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: