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 AndroidMotionEvent'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 belirtenMotionEventsabiti. 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österenMotionEventsabiti.FLAG_CANCELED: İşaretçinin yukarı gitmesinin, istenmeyen bir dokunma etkinliğine neden olduğunu belirtenMotionEventsabiti. Android 13 (API düzeyi 33) ve sonraki sürümlerdekiACTION_POINTER_UPveACTION_CANCELetkinliklerine 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_CANCELişaretini kontrol edin. Android 13 ve sonraki sürümlerde, dokunmanın yanlışlıkla yapıldığını onaylamak içinFLAG_CANCELEDsimgesini de kontrol edin. - Çoklu dokunma etkinlikleri: Android 13 ve sonraki sürümlerde, yanlışlıkla dokunmaları belirlemek için
ACTION_POINTER_UPveFLAG_CANCELEDsimgelerini 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:
- Android 13 özellikleri ve API'leri: Geliştirilmiş avuç içi algılama
- Geliştirici kılavuzları
- Gelişmiş kalem özellikleri
- Büyük ekranlarda giriş uyumluluğu bölümündeki Avuç içiyle dokunmayı reddetme
- Codelab: Android uygulamasında ekran kalemi desteğini geliştirme