Jetpack Compose, दो मॉडिफ़ायर की मदद से खींचकर छोड़ने और छोड़ने की सुविधा देता है:
dragAndDropSource
: यह जेस्चर के शुरुआती पॉइंट के तौर पर एक कंपोज़ेबल तय करता हैdragAndDropTarget
: इस कॉलम से ऐसे कंपोज़ेबल का पता चलता है जो ड्रॉप किए गए डेटा को स्वीकार करता है
उदाहरण के लिए, उपयोगकर्ताओं को आपके ऐप्लिकेशन में किसी इमेज को खींचकर छोड़ने की सुविधा देने के लिए, कोई ऐसी इमेज बनाएं जिसे जोड़ने के लिए उसे इस्तेमाल किया जा सके
और dragAndDropSource
मॉडिफ़ायर जोड़ें. ड्रॉप टारगेट सेट अप करने के लिए, दूसरा टारगेट बनाएं
इमेज कंपोज़ेबल और dragAndDropTarget
मॉडिफ़ायर जोड़ें.
मॉडिफ़ायर कई ड्रैग सोर्स और कई ड्रॉप टारगेट पर लागू किए जा सकते हैं.
मॉडिफ़ायर की मदद से ऐप्लिकेशन, दो या उससे ज़्यादा कंपोज़ेबल के बीच डेटा शेयर कर सकते हैं
ClipData
का इस्तेमाल करके, जो View
लागू करने के साथ इंटरऑपरेबल है.
खींचें और छोड़ें इवेंट शुरू करें
किसी कॉम्पोनेंट में इवेंट खींचने और छोड़ने के लिए, dragAndDropSource
मॉडिफ़ायर जोड़ें.
जो सस्पेंडिंग फ़ंक्शन को पैरामीटर के रूप में लेता है. फ़ंक्शन, उपयोगकर्ता के बारे में बताता है
ऐसा इंटरैक्शन जो खींचें और छोड़ें. dragAndDropSource
मॉडिफ़ायर
यह पॉइंटर इनपुट इवेंट मिलने तक इंतज़ार करता है. इसके बाद, यह Lambda फ़ंक्शन को एक्ज़ीक्यूट करता है
इवेंट हैंडलर को भेजा जाता है. कई तरह के इनपुट इवेंट का पता लगाने के लिए, Lambda फ़ंक्शन का इस्तेमाल करें,
उदाहरण के लिए, टैप या दबाकर रखना. ज़्यादा जानकारी के लिए, Pointer देखें
लिखें में इनपुट करें.
आम तौर पर, पॉइंटर इनपुट इवेंट को इतनी देर तक दबाकर रखा जाता है:
Modifier.dragAndDropSource { detectTapGestures(onLongPress = { // Transfer data here. }) }
खींचें और छोड़ें सेशन शुरू करने के लिए, startTransfer()
फ़ंक्शन को कॉल करें.
इस दायरे में, DragAndDropTransferData
का इस्तेमाल करके
ट्रांसफ़र किया जा सकता है. डेटा एक रिमोट यूआरआई, रिच टेक्स्ट डेटा हो सकता है
क्लिपबोर्ड, लोकल फ़ाइल या अन्य फ़ॉर्मैट में फ़ाइलें सेव की जाती हैं, लेकिन उन सभी को
ClipData
ऑब्जेक्ट. सादा टेक्स्ट दें. उदाहरण के लिए:
Modifier.dragAndDropSource { detectTapGestures(onLongPress = { startTransfer( DragAndDropTransferData( ClipData.newPlainText( "image Url", url ) ) ) }) }
खींचकर छोड़ने की कार्रवाई को ऐप्लिकेशन के बॉर्डर के पार करने के लिए,
DragAndDropTransferData
कंस्ट्रक्टर, flags
आर्ग्युमेंट को स्वीकार करता है. इस
नीचे दिए गए उदाहरण में, DRAG_FLAG_GLOBAL
कॉन्सटेंट से पता चलता है कि डेटा
इसे एक ऐप्लिकेशन से खींचकर दूसरे ऐप्लिकेशन में ले जाया जाएगा:
Modifier.dragAndDropSource { detectTapGestures(onLongPress = { startTransfer( DragAndDropTransferData( ClipData.newPlainText( "image Url", url ), flags = View.DRAG_FLAG_GLOBAL ) ) }) }
DragAndDropTransferData
, Android View सिस्टम के साथ काम करने वाले फ़्लैग स्वीकार करता है. यहां जाएं:
उपलब्ध फ़्लैग की पूरी सूची के लिए, देखें कॉन्सटेंट की सूची.
ड्रॉप का डेटा पाएं
कंपोज़ेबल को चालू करने के लिए, किसी कंपोज़ेबल में dragAndDropTarget
मॉडिफ़ायर असाइन करें
इवेंट बनाने के लिए, 'खींचें और छोड़ें' सुविधा का इस्तेमाल करें. मॉडिफ़ायर में दो पैरामीटर होते हैं: पहला
फ़िल्टर की तरह काम करता है और इससे तय होता है कि मॉडिफ़ायर किस तरह का डेटा स्वीकार कर सकता है. साथ ही,
दूसरा, डेटा को कॉलबैक में डिलीवर करता है.
ध्यान दें कि कॉलबैक इंस्टेंस याद रखा जाना चाहिए. नीचे दिया गया स्निपेट कॉलबैक को याद रखने का तरीका दिखाता है:
val callback = remember { object : DragAndDropTarget { override fun onDrop(event: DragAndDropEvent): Boolean { // Parse received data return true } } }
अगले स्निपेट में, छूटे हुए सादे टेक्स्ट को मैनेज करने का तरीका बताया गया है:
Modifier.dragAndDropTarget( shouldStartDragAndDrop = { event -> event.mimeTypes().contains(ClipDescription.MIMETYPE_TEXT_PLAIN) }, target = callback )
अगर इवेंट इस्तेमाल किया जा रहा है, तो कॉलबैक फ़ंक्शन को true
या false
दिखना चाहिए
अगर इवेंट अस्वीकार कर दिया जाता है और पैरंट कॉम्पोनेंट में लागू नहीं होता है.
'खींचें और छोड़ें' इवेंट मैनेज करना
DragAndDropTarget
इंटरफ़ेस में कॉलबैक को बदलें, ताकि यह देखा जा सके कि
इवेंट की सटीक जानकारी के लिए, खींचें और छोड़ें इवेंट किसी कॉम्पोनेंट को शुरू करता है, खत्म होता है या किसी कॉम्पोनेंट में शामिल होता है या बाहर निकल जाता है
यूज़र इंटरफ़ेस (यूआई) और ऐप्लिकेशन के काम करने के तरीके को कंट्रोल करने के लिए:
object : DragAndDropTarget { override fun onStarted(event: DragAndDropEvent) { // When the drag event starts } override fun onEntered(event: DragAndDropEvent) { // When the dragged object enters the target surface } override fun onEnded(event: DragAndDropEvent) { // When the drag event stops } override fun onExited(event: DragAndDropEvent) { // When the dragged object exits the target surface } override fun onDrop(event: DragAndDropEvent): Boolean = true }
अन्य संसाधन
कोडलैब (कोड बनाना सीखना): Compose में खींचें और छोड़ें