स्टाइलस पाम अस्वीकार होना

पांच स्टार वाली रेटिंग का आइकॉन

स्टाइलस, बहुत ही क्रिएटिव और काम का टूल हो सकता है. हालांकि, जब उपयोगकर्ता स्टाइलस का इस्तेमाल करके किसी ऐप्लिकेशन पर लिखते हैं, ड्रॉ करते हैं या उससे इंटरैक्ट करते हैं, तो कभी-कभी वे अपने हाथ की हथेली से स्क्रीन को छू लेते हैं. सिस्टम के इवेंट को गलती से हथेली से टच होने के तौर पर पहचानने और खारिज करने से पहले, आपके ऐप्लिकेशन को टच इवेंट की सूचना दी जा सकती है.

सबसे सही तरीके

आपके ऐप्लिकेशन को गैर-ज़रूरी टच इवेंट की पहचान करनी चाहिए और उन्हें अनदेखा करना चाहिए. Jetpack Compose में, PointerEvent से, Android के MotionEvent को ऐक्सेस किया जा सकता है. ACTION_CANCEL के लिए MotionEvent देखें. इससे पता चलता है कि किसी जेस्चर को रोकना चाहिए और उसे पहले जैसा किया जा सकता है. Android 13 (एपीआई लेवल 33) और इसके बाद के वर्शन पर, ACTION_CANCEL और ACTION_POINTER_UP इवेंट पर FLAG_CANCELED फ़्लैग की जांच करें. इससे यह पता चलता है कि टच गलती से हुआ है. जैसे, हथेली से टच होना.

सामग्री

  • Modifier.pointerInput(): यह Compose मॉडिफ़ायर, पॉइंटर इनपुट को प्रोसेस करने के लिए इस्तेमाल किया जाता है.
  • PointerEvent: यह Compose में एक पॉइंटर इवेंट को दिखाता है. इसमें एक या उससे ज़्यादा बदलाव शामिल होते हैं.
  • PointerEvent.motionEvent: यह एक्सटेंशन प्रॉपर्टी है. इससे Android MotionEvent (शून्य हो सकता है) को ऐक्सेस किया जा सकता है.
  • MotionEvent: इससे टच और मूवमेंट इवेंट के बारे में पता चलता है. इसमें वह जानकारी होती है जिससे यह तय किया जा सकता है कि किसी इवेंट को अनदेखा किया जाना चाहिए या नहीं.
  • ACTION_CANCEL: MotionEvent एक ऐसा कॉन्स्टेंट है जो यह बताता है कि जेस्चर रद्द कर दिया गया है. जेस्चर को बंद कर दिया जाना चाहिए और इसे पहले जैसा किया जा सकता है.
  • ACTION_POINTER_UP: MotionEvent ऐसा कॉन्स्टेंट है जो यह दिखाता है कि पहले पॉइंटर के अलावा कोई दूसरा पॉइंटर ऊपर चला गया है. इसका मतलब है कि उसने डिवाइस की स्क्रीन से संपर्क छोड़ दिया है.
  • FLAG_CANCELED: MotionEvent कॉन्स्टेंट से पता चलता है कि पॉइंटर के ऊपर जाने की वजह से, अनजाने में टच इवेंट हुआ है. Android 13 (एपीआई लेवल 33) और उसके बाद के वर्शन पर, ACTION_POINTER_UP और ACTION_CANCEL इवेंट में जोड़ा गया.

चरण

आपके ऐप्लिकेशन को भेजे गए MotionEvent ऑब्जेक्ट की जांच करें. इवेंट की विशेषताओं का पता लगाने के लिए, MotionEvent एपीआई का इस्तेमाल करें:

  • सिंगल-पॉइंटर इवेंटACTION_CANCEL की जांच करें. इससे पता चलता है कि जेस्चर को रोकना चाहिए. Android 13 और इसके बाद के वर्शन पर, FLAG_CANCELED की जांच करके यह भी पुष्टि करें कि टच गलती से हुआ था.
  • एक से ज़्यादा पॉइंटर वाले इवेंट — Android 13 और इसके बाद के वर्शन पर, अनजाने में किए गए टच की पहचान करने के लिए ACTION_POINTER_UP और FLAG_CANCELED की जांच करें.

इन इवेंट का जवाब देने के लिए, जेस्चर को रोकें और किसी भी अस्थायी बदलाव को पहले जैसा करें.

1. मोशन इवेंट ऑब्जेक्ट हासिल करना

किसी कंपोज़ेबल पर पॉइंटर इनपुट को प्रोसेस करने के लिए, 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.
                        }
                    }
                }
            }
    )

2. इवेंट ऐक्शन और फ़्लैग तय करना

MotionEvent के लिए 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.
                                }
                            }
                        }
                    }
                }
            }
    )

3. हाथ के जेस्चर को पहले जैसा करें

हथेली से छूने का पता चलने पर, स्क्रीन पर किए गए जेस्चर के इफ़ेक्ट को पहले जैसा किया जा सकता है.

आपके ऐप्लिकेशन को उपयोगकर्ता की कार्रवाइयों का इतिहास सेव रखना चाहिए, ताकि हथेली के छूने जैसे अनचाहे इनपुट को वापस लाया जा सके. उदाहरण के लिए, Android ऐप्लिकेशन में स्टाइलस की सुविधा को बेहतर बनाना कोडलैब में, ड्राइंग की सुविधा वाला बेसिक ऐप्लिकेशन लागू करना देखें.

नतीजे

आपका ऐप्लिकेशन अब Android 13 और इसके बाद के एपीआई लेवल पर, एक से ज़्यादा पॉइंटर वाले इवेंट के लिए हथेली से किए गए टच का पता लगा सकता है और उन्हें अस्वीकार कर सकता है. साथ ही, सभी एपीआई लेवल पर, एक पॉइंटर वाले इवेंट के लिए हथेली से किए गए टच का पता लगा सकता है और उन्हें अस्वीकार कर सकता है.

अन्य संसाधन

ज़्यादा जानकारी के लिए, यह लेख पढ़ें: