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

इस्तेमाल किए जा सकने वाले XR डिवाइस
इन दिशा-निर्देशों से आपको इस तरह के एक्सआर डिवाइसों के लिए अनुभव तैयार करने में मदद मिलती है.
डिसप्ले ग्लास

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 मॉडिफ़ायर को पास किया जा सके.