লেখনী পাম প্রত্যাখ্যান

পাঁচ তারকা রেটিং আইকন

স্টাইলাস একটি অত্যন্ত কার্যকরী এবং সৃজনশীল সরঞ্জাম হতে পারে। কিন্তু যখন ব্যবহারকারীরা স্টাইলাস ব্যবহার করে আঁকেন, লেখেন বা কোনো অ্যাপের সাথে ইন্টারঅ্যাক্ট করেন, তখন তারা মাঝে মাঝে তাদের হাতের তালু দিয়ে স্ক্রিন স্পর্শ করে ফেলেন। সিস্টেমটি এই ঘটনাটিকে একটি অনিচ্ছাকৃত তালুর স্পর্শ হিসেবে শনাক্ত করে খারিজ করার আগেই, এই টাচ ইভেন্টটি আপনার অ্যাপে রিপোর্ট করা হতে পারে।

সর্বোত্তম অনুশীলন

আপনার অ্যাপকে অপ্রয়োজনীয় টাচ ইভেন্টগুলো শনাক্ত করে উপেক্ষা করতে হবে। Jetpack Compose-এ, আপনি একটি PointerEvent থেকে অন্তর্নিহিত Android MotionEvent অ্যাক্সেস করতে পারেন। MotionEventACTION_CANCEL আছে কিনা তা পরীক্ষা করুন, যা নির্দেশ করে যে একটি জেসচার বন্ধ করা উচিত এবং এটিকে রোলব্যাক করার প্রয়োজন হতে পারে। Android 13 (API লেভেল 33) এবং তার উপরের সংস্করণগুলিতে, ACTION_CANCEL এবং ACTION_POINTER_UP ইভেন্টগুলিতে FLAG_CANCELED ফ্ল্যাগটি পরীক্ষা করুন, যা একটি জোরালো সংকেত দেয় যে টাচটি অনিচ্ছাকৃত ছিল, যেমন হাতের তালুর স্পর্শ।

উপকরণ

  • Modifier.pointerInput() : পয়েন্টার ইনপুট প্রসেস করার জন্য ব্যবহৃত কম্পোজ মডিফায়ার।
  • PointerEvent : Compose-এর একটি পয়েন্টার ইভেন্টকে বোঝায়, যাতে এক বা একাধিক পরিবর্তন থাকে।
  • PointerEvent.motionEvent : এক্সটেনশন প্রপার্টি যা অন্তর্নিহিত অ্যান্ড্রয়েড MotionEvent এ অ্যাক্সেস প্রদান করে (নালযোগ্য)।
  • MotionEvent : স্পর্শ এবং নড়াচড়ার ইভেন্টকে বোঝায়। কোনো ইভেন্টকে অগ্রাহ্য করা হবে কি না, তা নির্ধারণ করার জন্য প্রয়োজনীয় তথ্য এতে থাকে।
  • ACTION_CANCEL : MotionEvent কনস্ট্যান্ট যা নির্দেশ করে যে একটি জেসচার বাতিল করা হয়েছে; জেসচারটি বন্ধ হয়ে যাবে এবং এটিকে পূর্বাবস্থায় ফিরিয়ে আনার প্রয়োজন হতে পারে।
  • ACTION_POINTER_UP : MotionEvent কনস্ট্যান্ট যা নির্দেশ করে যে প্রথম পয়েন্টারটি ছাড়া অন্য কোনো পয়েন্টার উপরে উঠে গেছে (অর্থাৎ, ডিভাইস স্ক্রিনের সাথে সংযোগ বিচ্ছিন্ন করেছে)।
  • FLAG_CANCELED : MotionEvent কনস্ট্যান্ট যা নির্দেশ করে যে পয়েন্টারটি উপরে ওঠার কারণে একটি অনিচ্ছাকৃত টাচ ইভেন্ট ঘটেছে। Android 13 (API লেভেল 33) এবং তার পরবর্তী সংস্করণগুলিতে ACTION_POINTER_UP এবং ACTION_CANCEL ইভেন্টগুলিতে এটি যুক্ত করা হয়েছে।

পদক্ষেপ

আপনার অ্যাপে পাঠানো MotionEvent অবজেক্টগুলো পরীক্ষা করুন। ইভেন্টের বৈশিষ্ট্য নির্ধারণ করতে MotionEvent API ব্যবহার করুন:

  • সিঙ্গেল-পয়েন্টার ইভেন্টACTION_CANCEL আছে কিনা তা পরীক্ষা করুন, যা নির্দেশ করে যে জেসচারটি বন্ধ করা উচিত। অ্যান্ড্রয়েড ১৩ এবং তার পরবর্তী সংস্করণগুলিতে, টাচটি অনিচ্ছাকৃত ছিল কিনা তা নিশ্চিত করতে FLAG_CANCELED আছে কিনা তাও পরীক্ষা করুন।
  • মাল্টি-পয়েন্টার ইভেন্ট — অ্যান্ড্রয়েড ১৩ এবং তার পরবর্তী সংস্করণগুলোতে, অনিচ্ছাকৃত স্পর্শ শনাক্ত করতে ACTION_POINTER_UP এবং FLAG_CANCELED ইভেন্টগুলো পরীক্ষা করুন।

এই ঘটনাগুলোর পরিপ্রেক্ষিতে অঙ্গভঙ্গিটি বন্ধ করুন এবং যেকোনো অস্থায়ী পরিবর্তন পূর্বাবস্থায় ফিরিয়ে নিন।

১. গতি ইভেন্ট অবজেক্টগুলি সংগ্রহ করুন

একটি Composable-এ পয়েন্টার ইনপুট প্রসেস করতে Modifier.pointerInput ব্যবহার করুন। পয়েন্টার ইনপুট স্কোপের মধ্যে, ইভেন্ট গ্রহণ করতে awaitPointerEventScope এবং awaitPointerEvent ব্যবহার করুন, এবং motionEvent প্রপার্টি ব্যবহার করে অন্তর্নিহিত অ্যান্ড্রয়েড 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.
                        }
                    }
                }
            }
    )

২. ইভেন্টের অ্যাকশন এবং ফ্ল্যাগগুলো নির্ধারণ করুন

ACTION_CANCEL এর জন্য MotionEvent পরীক্ষা করুন, যা সমস্ত API স্তরে একটি একক-পয়েন্টার ইভেন্ট নির্দেশ করে। Android 13 এবং তার উপরের সংস্করণগুলিতে, FLAG_CANCELED এর জন্য ACTION_POINTER_UP পরীক্ষা করুন।

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

৩. অঙ্গভঙ্গিটি পূর্বাবস্থায় ফিরিয়ে আনুন।

একবার পাম টাচ শনাক্ত করার পর, আপনি সেই জেসচারের অনস্ক্রিন প্রভাবগুলো পূর্বাবস্থায় ফিরিয়ে আনতে পারবেন।

আপনার অ্যাপকে অবশ্যই ব্যবহারকারীর কার্যকলাপের ইতিহাস রাখতে হবে, যাতে হাতের তালুতে স্পর্শের মতো অনিচ্ছাকৃত ইনপুটগুলো পূর্বাবস্থায় ফিরিয়ে আনা যায়। একটি উদাহরণের জন্য, 'Enhance stylus support in an Android app' কোডল্যাবের 'Implement a basic drawing app' অংশটি দেখুন।

ফলাফল

আপনার অ্যাপ এখন অ্যান্ড্রয়েড ১৩ এবং তার উচ্চতর এপিআই লেভেলে মাল্টি-পয়েন্টার ইভেন্টের জন্য এবং সকল এপিআই লেভেলে সিঙ্গেল-পয়েন্টার ইভেন্টের জন্য পাম টাচ শনাক্ত ও প্রত্যাখ্যান করতে পারবে।

অতিরিক্ত সম্পদ

আরও তথ্যের জন্য, নিম্নলিখিতগুলি দেখুন: