عدم پذیرش کف دست با قلم

نماد رده‌بندی پنج ستاره

قلم می‌تواند ابزاری فوق‌العاده پربازده و خلاقانه باشد. اما وقتی کاربران بااستفاده از قلم طراحی می‌کنند، می‌نویسند، یا با برنامه‌ای تعامل برقرار می‌کنند، گاهی اوقات کف دستشان با صفحه‌نمایش تماس پیدا می‌کند. رویداد لمس می‌تواند قبل‌از اینکه سیستم رویداد را به‌عنوان لمس اتفاقی کف دست تشخیص دهد و آن را ببندد، به برنامه‌تان گزارش شود.

روال‌های مطلوب

برنامه شما باید رویدادهای لمسی اضافی را شناسایی کند و آن‌ها را نادیده بگیرد. در Jetpack Compose، می‌توانید ازطریق PointerEvent به Android زیرین MotionEvent دسترسی پیدا کنید. MotionEvent را برای ACTION_CANCEL بررسی کنید، که نشان می‌دهد اشاره باید متوقف شود و ممکن است نیاز به برگرداندن داشته باشد. در Android 13 (سطح API 33) و بالاتر، پرچم FLAG_CANCELED را در رویدادهای ACTION_CANCEL و ACTION_POINTER_UP بررسی کنید، که نشانه‌ای قوی از غیرعمدی بودن لمس ارائه می‌دهد، مثلاً لمس با کف دست.

مواد تشکیل‌دهنده

  • Modifier.pointerInput(): اصلاح‌گر «ترکیب» برای پردازش ورودی اشاره‌گر استفاده می‌شود.
  • PointerEvent: نشان‌دهنده رویداد اشاره‌گر در «نوشتن» است که شامل یک یا چند تغییر است.
  • PointerEvent.motionEvent: دارایی افزونه‌ای که دسترسی به ‫Android MotionEvent زیرین را فراهم می‌کند (تهی‌پذیر).
  • MotionEvent: نشان‌دهنده رویدادهای لمس و حرکت است. حاوی اطلاعات لازم برای تعیین اینکه آیا رویدادی باید نادیده گرفته شود یا نه.
  • ACTION_CANCEL: ثابت MotionEvent که نشان می‌دهد اشاره‌ای لغو شده است؛ اشاره باید متوقف شود و ممکن است نیاز به برگرداندن داشته باشد.
  • ACTION_POINTER_UP: ثابت MotionEvent که نشان می‌دهد اشاره‌گری به‌جز اشاره‌گر اول بالا رفته است (یعنی تماس با صفحه دستگاه را رها کرده است).
  • FLAG_CANCELED: ثابت MotionEvent که نشان می‌دهد اشاره‌گر درحال بالا رفتن باعث رویداد لمس غیرعمدی شده است. به ACTION_POINTER_UP و ACTION_CANCEL رویداد در Android 13 (سطح میانای برنامه‌سازی کاربردی ۳۳) و بالاتر اضافه شد.

قدم‌ها

اشیاء MotionEvent ارسال‌شده به برنامه‌تان را بررسی کنید. از «میاناهای برنامه‌سازی کاربردی» MotionEvent برای تعیین ویژگی‌های رویداد استفاده کنید:

  • رویدادهای تک‌اشاره‌ای — ACTION_CANCEL را بررسی کنید، که نشان می‌دهد اشاره باید متوقف شود. در Android 13 و نسخه‌های بالاتر، همچنین FLAG_CANCELED را بررسی کنید تا مطمئن شوید لمس غیرعمدی بوده است.
  • رویدادهای چند اشاره‌ای — در Android 13 و نسخه‌های بالاتر، ACTION_POINTER_UP و FLAG_CANCELED را بررسی کنید تا لمس‌های ناخواسته را شناسایی کنید.

با متوقف کردن اشاره و برگرداندن تغییرات موقت، به این رویدادها پاسخ دهید.

۱. به‌دست آوردن اشیای رویداد حرکتی

از Modifier.pointerInput برای پردازش ورودی اشاره‌گر در «ترکیب‌شدنی» استفاده کنید. در محدوده ورودی اشاره‌گر، از awaitPointerEventScope و awaitPointerEvent برای دریافت رویدادها استفاده کنید و MotionEvent زیرین Android را بااستفاده از دارایی motionEvent بازیابی کنید:

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.
                        }
                    }
                }
            }
    )

۲. تعیین کنش رویداد و پرچم‌ها

MotionEvent را برای ACTION_CANCEL بررسی کنید، که نشان‌دهنده رویداد تک‌اشاره‌ای در همه سطوح میانای برنامه‌سازی کاربردی است. در Android 13 و بالاتر، ACTION_POINTER_UP برای FLAG_CANCELED را بررسی کنید:

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.
                                }
                            }
                        }
                    }
                }
            }
    )

۳. واگرداندن اشاره

پس‌از شناسایی لمس کف دست، می‌توانید جلوه‌های روی صفحه ژست را واگرد کنید.

برنامه شما باید سابقه کنش‌های کاربر را حفظ کند تا ورودی‌های ناخواسته مثل تماس کف دست قابل واگرداندن باشد. برای نمونه، به پیاده‌سازی برنامه طراحی پایه در codelab بهبود دادن پشتیبانی از قلم در برنامه Android مراجعه کنید.

نتایج

برنامه شما اکنون می‌تواند لمس‌های کف دست را برای رویدادهای چنداشاره‌ای در Android 13 و سطوح API بالاتر و برای رویدادهای تک‌اشاره‌ای در همه سطوح API شناسایی و رد کند.

منابع بیشتر

برای اطلاعات بیشتر، به موارد زیر مراجعه کنید: