Jetpack Compose Glimmer में, पॉइंटर के इनडायरेक्ट इनपुट को मैनेज करना

एक्सआर डिवाइसों पर लागू होने वाली सुविधाएँ
इन दिशा-निर्देशों से आपको इस तरह के एक्सआर डिवाइसों के लिए अनुभव बनाने में मदद मिलती है.
ऑडियो और
डिसप्ले ग्लास

onIndirectPointerGesture मॉडिफ़ायर की मदद से, कॉम्पोनेंट को हाई-लेवल के इनडायरेक्ट पॉइंटर इवेंट मिलते हैं और वह उनका जवाब दे पाता है. जैसे, डिवाइस के टचपैड से जनरेट होने वाले इवेंट. इस मॉडिफ़ायर का इस्तेमाल, टचपैड या इसी तरह के किसी सोर्स से मिलने वाले जेस्चर को कैप्चर और प्रोसेस करने के लिए करें.

एपीआई सरफ़ेस

आपके ऐप्लिकेशन के पास चार कॉलबैक होते हैं, जिनका इस्तेमाल करके वह हैंडलिंग को कंट्रोल कर सकता है:

  • onClick: यह इवेंट तब ट्रिगर होता है, जब उपयोगकर्ता, स्क्रीन पर टैप या क्लिक करता है और उसकी उंगली या कर्सर में ज़्यादा हॉरिज़ॉन्टल मूवमेंट नहीं होता है.
  • onSwipeForward: यह तब ट्रिगर होता है, जब हॉरिज़ॉन्टल स्वाइप, आगे की ओर तय की गई दूरी और वेलोसिटी थ्रेशोल्ड से ज़्यादा हो.
  • onSwipeBackward: यह तब ट्रिगर होता है, जब हॉरिज़ॉन्टल स्वाइप, पीछे की ओर तय की गई दूरी और वेलोसिटी थ्रेशोल्ड से ज़्यादा हो.
  • Enabled: इसे false पर सेट करने पर, मॉडिफ़ायर को अनदेखा कर दिया जाता है और किसी भी कॉलबैक को शुरू नहीं किया जाता.

स्वाइप करने और स्क्रोल करने पर सिस्टम के काम करने का तरीका

सिस्टम, क्लिक और स्वाइप के बीच अंतर करने के लिए, टच स्लोप थ्रेशोल्ड का इस्तेमाल करता है.

  • अगर पॉइंटर को दबाकर रखने के दौरान वह काफ़ी हिलता है, तो onClick रद्द हो जाता है.
  • अगर पॉइंटर को मूव करते समय पीछे की ओर ले जाया जाता है, तो स्वाइप करने के जेस्चर को अमान्य कर दिया जाता है.

उदाहरण: किसी कॉम्पोनेंट पर स्वाइप और क्लिक करने की सुविधा सेट अप करना

नीचे दिए गए कोड में, फ़ोकस किए जा सकने वाले Box पर स्वाइप और क्लिक करने की सुविधा सेट अप की गई है:

@Composable
fun OnIndirectPointerGestureSample() {
    var lastGesture by remember { mutableStateOf("None") }

    Box(
        modifier =
            Modifier.fillMaxSize()
                .onIndirectPointerGesture(
                    enabled = true,
                    onSwipeForward = { lastGesture = "Forward" },
                    onSwipeBackward = { lastGesture = "Backward" },
                    onClick = { lastGesture = "Click" },
                )
                .focusTarget(),
        contentAlignment = Alignment.Center,
    ) {
        Text("Last Gesture: $lastGesture")
    }
}

कोड के बारे में अहम बातें

  • onIndirectPointerGesture पर फ़ोकस करने की ज़रूरत होती है. इसलिए, focusTarget को भी लागू किया जाता है, ताकि Box पर फ़ोकस किया जा सके. focusTarget या फ़ोकस चालू करने वाले किसी अन्य मॉडिफ़ायर, जैसे कि surface का इस्तेमाल किया जा सकता है. फ़ोकस के बिना, मॉडिफ़ायर अप्रत्यक्ष पॉइंटर इवेंट पर कार्रवाई नहीं कर सकता.
  • इस उदाहरण में, onSwipeForward और onClick, दोनों कॉलबैक लागू किए गए हैं. इसलिए, स्वाइप और क्लिक के जिन जेस्चर का पता चलता है उन्हें इंटरसेप्ट और इस्तेमाल किया जाता है. साथ ही, वे पैरंट कंटेनर तक नहीं पहुंचते हैं. हालांकि, किसी जेस्चर को पैरंट कंटेनर में मौजूद onIndirectPointerGesture मॉडिफ़ायर पर पास करने के लिए, किसी खास कॉलबैक को भी शून्य पर सेट किया जा सकता है.