وقتی کاربران با استفاده از قلم نوری نقاشی میکنند، مینویسند یا با یک برنامه تعامل میکنند، گاهی اوقات صفحه را با کف دست خود لمس میکنند. رویداد لمس ممکن است قبل از اینکه سیستم آن را به عنوان یک لمس تصادفی کف دست تشخیص دهد و نادیده بگیرد، به برنامه شما گزارش شود.
برنامه شما باید رویدادهای لمسی نامربوط را شناسایی کرده و آنها را نادیده بگیرد. سطوح API اندروید ۱۳ و بالاتر، لمس کف دست را متفاوت از سایر سطوح API نشان میدهند.
نتایج
برنامه شما قادر است لمس کف دست را برای رویدادهای چند اشارهگری در اندروید ۱۳ و سطوح API بالاتر و برای رویدادهای تک اشارهگری در تمام سطوح API شناسایی و رد کند.
لمس کف دست را تشخیص داده و نادیده بگیرید
اندروید با ارسال یک شیء MotionEvent به برنامه شما، لمس کف دست را لغو میکند.
اشیاء
MotionEventکه به برنامه شما ارسال میشوند را بررسی کنید. از APIهایMotionEventبرای تعیین ویژگیهای رویداد (اعمال و پرچمها) استفاده کنید:- رویدادهای تکمنظوره -
ACTION_CANCELرا بررسی کنید. در اندروید ۱۳ و بالاتر،FLAG_CANCELEDرا نیز بررسی کنید. - رویدادهای چند اشارهگری - در اندروید ۱۳ و بالاتر،
ACTION_POINTER_UPوFLAG_CANCELEDرا بررسی کنید.
- رویدادهای تکمنظوره -
رویدادهای حرکتی که دارای ویژگیهای
ACTION_CANCELوACTION_POINTER_UP/FLAG_CANCELEDهستند را نادیده بگیرید.
۱. اشیاء رویداد حرکتی را بدست آورید
یک OnTouchListener به برنامه خود اضافه کنید:
کاتلین
val myView = findViewById<View>(R.id.myView).apply { setOnTouchListener { view, event -> // Process motion event. } }
جاوا
View myView = findViewById(R.id.myView); myView.setOnTouchListener( (view, event) -> { // Process motion event. });
۲. اقدام و پرچمهای رویداد را تعیین کنید
ACTION_CANCEL را بررسی کنید که نشان دهنده یک رویداد تک اشارهگری در تمام سطوح API است. در اندروید ۱۳ و بالاتر، ACTION_POINTER_UP برای FLAG_CANCELED.
کاتلین
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 } }
جاوا
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; });
۳. لغو حرکت
پس از اینکه لمس با کف دست را شناسایی کردید، میتوانید اثرات روی صفحه نمایش آن حرکت را لغو کنید.
برنامه شما باید سابقهای از اقدامات کاربر را نگه دارد تا ورودیهای ناخواسته مانند لمس کف دست قابل لغو باشند. برای مثالی از نحوه نگهداری سابقه، به پیادهسازی یک برنامه طراحی اولیه در پشتیبانی از قلم Enhance در یک آزمایشگاه کد برنامه اندروید مراجعه کنید.
نکات کلیدی
-
MotionEvent: رویدادهای لمسی و حرکتی را نشان میدهد. حاوی اطلاعات لازم برای تعیین اینکه آیا یک رویداد باید نادیده گرفته شود یا خیر. -
OnTouchListener#onTouch(): اشیاءMotionEventرا دریافت میکند. -
MotionEvent#getActionMasked(): اکشن مرتبط با یک رویداد حرکتی را برمیگرداند. -
ACTION_CANCEL: ثابتMotionEventکه نشان میدهد یک حرکت باید لغو شود. -
ACTION_POINTER_UP: ثابتMotionEventکه نشان میدهد اشارهگری غیر از اشارهگر اول بالا رفته است (یعنی تماس با صفحه نمایش دستگاه را رها کرده است). -
FLAG_CANCELED: ثابتMotionEventکه نشان میدهد بالا رفتن اشارهگر باعث یک رویداد لمس غیرعمدی شده است. به رویدادهایACTION_POINTER_UPوACTION_CANCELدر اندروید ۱۳ (سطح API ۳۳) و بالاتر اضافه شده است.
مجموعههایی که حاوی این راهنما هستند
این راهنما بخشی از این مجموعههای راهنمای سریعِ برگزیده است که اهداف گستردهتر توسعه اندروید را پوشش میدهد:

بهینه سازی برای صفحه نمایش های بزرگ
سوالی یا بازخوردی دارید؟
وقتی کاربران با استفاده از قلم نوری نقاشی میکنند، مینویسند یا با یک برنامه تعامل میکنند، گاهی اوقات صفحه را با کف دست خود لمس میکنند. رویداد لمس ممکن است قبل از اینکه سیستم آن را به عنوان یک لمس تصادفی کف دست تشخیص دهد و نادیده بگیرد، به برنامه شما گزارش شود.
برنامه شما باید رویدادهای لمسی نامربوط را شناسایی کرده و آنها را نادیده بگیرد. سطوح API اندروید ۱۳ و بالاتر، لمس کف دست را متفاوت از سایر سطوح API نشان میدهند.
نتایج
برنامه شما قادر است لمس کف دست را برای رویدادهای چند اشارهگری در اندروید ۱۳ و سطوح API بالاتر و برای رویدادهای تک اشارهگری در تمام سطوح API شناسایی و رد کند.
لمس کف دست را تشخیص داده و نادیده بگیرید
اندروید با ارسال یک شیء MotionEvent به برنامه شما، لمس کف دست را لغو میکند.
اشیاء
MotionEventکه به برنامه شما ارسال میشوند را بررسی کنید. از APIهایMotionEventبرای تعیین ویژگیهای رویداد (اعمال و پرچمها) استفاده کنید:- رویدادهای تکمنظوره -
ACTION_CANCELرا بررسی کنید. در اندروید ۱۳ و بالاتر،FLAG_CANCELEDرا نیز بررسی کنید. - رویدادهای چند اشارهگری - در اندروید ۱۳ و بالاتر،
ACTION_POINTER_UPوFLAG_CANCELEDرا بررسی کنید.
- رویدادهای تکمنظوره -
رویدادهای حرکتی که دارای ویژگیهای
ACTION_CANCELوACTION_POINTER_UP/FLAG_CANCELEDهستند را نادیده بگیرید.
۱. اشیاء رویداد حرکتی را بدست آورید
یک OnTouchListener به برنامه خود اضافه کنید:
کاتلین
val myView = findViewById<View>(R.id.myView).apply { setOnTouchListener { view, event -> // Process motion event. } }
جاوا
View myView = findViewById(R.id.myView); myView.setOnTouchListener( (view, event) -> { // Process motion event. });
۲. اقدام و پرچمهای رویداد را تعیین کنید
ACTION_CANCEL را بررسی کنید که نشان دهنده یک رویداد تک اشارهگری در تمام سطوح API است. در اندروید ۱۳ و بالاتر، ACTION_POINTER_UP برای FLAG_CANCELED.
کاتلین
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 } }
جاوا
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; });
۳. لغو حرکت
پس از اینکه لمس با کف دست را شناسایی کردید، میتوانید اثرات روی صفحه نمایش آن حرکت را لغو کنید.
برنامه شما باید سابقهای از اقدامات کاربر را نگه دارد تا ورودیهای ناخواسته مانند لمس کف دست قابل لغو باشند. برای مثالی از نحوه نگهداری سابقه، به پیادهسازی یک برنامه طراحی اولیه در پشتیبانی از قلم Enhance در یک آزمایشگاه کد برنامه اندروید مراجعه کنید.
نکات کلیدی
-
MotionEvent: رویدادهای لمسی و حرکتی را نشان میدهد. حاوی اطلاعات لازم برای تعیین اینکه آیا یک رویداد باید نادیده گرفته شود یا خیر. -
OnTouchListener#onTouch(): اشیاءMotionEventرا دریافت میکند. -
MotionEvent#getActionMasked(): اکشن مرتبط با یک رویداد حرکتی را برمیگرداند. -
ACTION_CANCEL: ثابتMotionEventکه نشان میدهد یک حرکت باید لغو شود. -
ACTION_POINTER_UP: ثابتMotionEventکه نشان میدهد اشارهگری غیر از اشارهگر اول بالا رفته است (یعنی تماس با صفحه نمایش دستگاه را رها کرده است). -
FLAG_CANCELED: ثابتMotionEventکه نشان میدهد بالا رفتن اشارهگر باعث یک رویداد لمس غیرعمدی شده است. به رویدادهایACTION_POINTER_UPوACTION_CANCELدر اندروید ۱۳ (سطح API ۳۳) و بالاتر اضافه شده است.
مجموعههایی که حاوی این راهنما هستند
این راهنما بخشی از این مجموعههای راهنمای سریعِ برگزیده است که اهداف گستردهتر توسعه اندروید را پوشش میدهد:
