عندما يرسم المستخدمون أو يكتبون أو يتفاعلون مع تطبيق باستخدام قلم شاشة، يلامسون أحيانًا الشاشة براحة أيديهم. قد يتم إرسال حدث اللمس إلى تطبيقك قبل أن يتعرّف النظام على الحدث ويرفضه باعتباره لمسة عرضية من راحة اليد.
يجب أن يحدّد تطبيقك أحداث اللمس غير الضرورية ويتجاهلها. تشير المستويات 13 والإصدارات الأحدث من واجهة برمجة التطبيقات في نظام Android إلى لمسات راحة اليد بشكل مختلف عن جميع مستويات واجهة برمجة التطبيقات الأخرى.
النتائج
يجب أن يكون تطبيقك قادرًا على التعرّف على لمسات راحة اليد ورفضها في أحداث المؤشرات المتعددة على الإصدار 13 من نظام التشغيل Android ومستويات واجهة برمجة التطبيقات الأحدث، وفي أحداث المؤشر الفردي على جميع مستويات واجهة برمجة التطبيقات.
تحديد لمسات راحة اليد وتجاهلها
يلغي نظام التشغيل Android لمسة راحة اليد من خلال إرسال عنصر MotionEvent
إلى تطبيقك.
افحص عناصر
MotionEvent
التي تم إرسالها إلى تطبيقك. استخدِم واجهات برمجة التطبيقاتMotionEvent
لتحديد خصائص الأحداث (الإجراءات والعلامات):- أحداث المؤشر الفردي: ابحث عن
ACTION_CANCEL
. في الإصدار 13 من نظام التشغيل Android والإصدارات الأحدث، ابحث أيضًا عنFLAG_CANCELED
. - أحداث المؤشرات المتعددة: في الإصدار 13 من نظام التشغيل Android والإصدارات الأحدث، تحقَّق من
ACTION_POINTER_UP
وFLAG_CANCELED
.
- أحداث المؤشر الفردي: ابحث عن
تجاهُل أحداث الحركة التي تتضمّن السمتَين
ACTION_CANCEL
وACTION_POINTER_UP
/FLAG_CANCELED
1. الحصول على عناصر أحداث الحركة
إضافة OnTouchListener
إلى تطبيقك:
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- تحديد إجراء الحدث وعلاماته
ابحث عن ACTION_CANCEL
، الذي يشير إلى حدث مؤشر واحد على جميع مستويات واجهة برمجة التطبيقات. في الإصدار 13 من نظام التشغيل Android والإصدارات الأحدث، ابحث عن FLAG_CANCELED.
في ACTION_POINTER_UP
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- التراجع عن الإيماءة
بعد تحديد لمسة براحة اليد، يمكنك التراجع عن التأثيرات التي تظهر على الشاشة نتيجة الإيماءة.
يجب أن يحتفظ تطبيقك بسجلّ لإجراءات المستخدمين حتى يمكن التراجع عن الإدخالات غير المقصودة، مثل لمسات راحة اليد. للاطّلاع على مثال حول كيفية الاحتفاظ بالسجلّ، راجِع تنفيذ تطبيق رسم أساسي في الدرس التطبيقي حول الترميز تحسين دعم القلم في تطبيق Android.
النقاط الرئيسية
MotionEvent
: يمثّل أحداث اللمس والحركة. يحتوي على المعلومات اللازمة لتحديد ما إذا كان يجب تجاهل حدث معيّن.-
OnTouchListener#onTouch()
: تتلقّى عناصرMotionEvent
. -
MotionEvent#getActionMasked()
: تعرض هذه السمة الإجراء المرتبط بحدث حركة. ACTION_CANCEL
: الثابتMotionEvent
الذي يشير إلى أنّه يجب التراجع عن إيماءة.-
ACTION_POINTER_UP
: الثابتMotionEvent
الذي يشير إلى أنّ مؤشرًا غير المؤشر الأول قد تم رفعه (أي تم إيقاف التفاعل مع شاشة الجهاز). FLAG_CANCELED
: الثابتMotionEvent
الذي يشير إلى أنّ رفع المؤشر أدّى إلى حدث لمسة غير مقصود. تمت إضافته إلى حدثَيACTION_POINTER_UP
وACTION_CANCEL
على الإصدار 13 من نظام التشغيل Android (المستوى 33 لواجهة برمجة التطبيقات) والإصدارات الأحدث.
المجموعات التي تتضمّن هذا الدليل
يشكّل هذا الدليل جزءًا من مجموعات "الدليل السريع" المنسّقة التي تغطي أهدافًا أوسع لتطوير تطبيقات Android:
