मुख्य सिद्धांत

नीचे दिए गए सेक्शन, खींचने और छोड़ने की प्रोसेस के कुछ मुख्य सिद्धांतों के बारे में बताते हैं.

'खींचें और छोड़ें' प्रोसेस

'खींचें और छोड़ें' प्रोसेस में चार चरण या स्थितियां होती हैं: शुरू, जारी है, छोड़ा गया, और खत्म हुआ.

शुरू किया गया

उपयोगकर्ता के ड्रैग जेस्चर की प्रतिक्रिया में, आपका ऐप्लिकेशन कॉल करता है सिस्टम को खींचें और छोड़ें कार्रवाई शुरू करने का निर्देश देने के लिए startDragAndDrop(). कॉन्टेंट बनाने विधि के तर्क निम्न उपलब्ध कराते हैं:

  • खींचा जाने वाला डेटा.
  • ड्रैग शैडो बनाने के लिए कॉलबैक
  • खींचे गए डेटा की जानकारी देने वाला मेटाडेटा
  • खींचकर छोड़ने के लिए सिस्टम आपके ऐप्लिकेशन पर वापस कॉल करके जवाब देता है शैडो. इसके बाद, सिस्टम डिवाइस पर ड्रैग शैडो दिखाता है.
  • इसके बाद, सिस्टम कार्रवाई प्रकार के साथ एक ड्रैग इवेंट भेजता है ACTION_DRAG_STARTED खींचकर इवेंट में छोड़ें मौजूदा लेआउट में सभी View ऑब्जेक्ट के लिसनर. यहां की यात्रा पर हूं ड्रैग इवेंट मिलना जारी रहेगा—इसमें संभावित गिरावट भी शामिल है इवेंट—खींचें और छोड़ें इवेंट लिसनर को true दिखना चाहिए. यह रजिस्टर होता है लिसनर को सिस्टम से कनेक्ट करता है. सिर्फ़ रजिस्टर किए गए लोग इस सुविधा का इस्तेमाल जारी रखेंगे ड्रैग इवेंट पाएं. इसके बाद, पॉडकास्ट सुनने वाले लोग यह भी बदल सकते हैं कि लॉन्च के बाद टारगेट View ऑब्जेक्ट कैसा दिखेगा, ताकि यह पता चल सके कि व्यू ड्रॉप इवेंट स्वीकार करें.
  • अगर ड्रैग इवेंट लिसनर false लौटाता है, तो उसे ड्रैग नहीं किया जाता है मौजूदा ऑपरेशन के इवेंट जब तक सिस्टम एक ड्रैग इवेंट नहीं भेजता कार्रवाई के टाइप ACTION_DRAG_ENDED के साथ. false लौटाकर, लिसनर सिस्टम को बताता है कि उसे कोई दिलचस्पी नहीं है और वह खींचे गए डेटा को स्वीकार नहीं करना चाहता.
प्रोसेस जारी है
उपयोगकर्ता, आइटम को खींचना और छोड़ना जारी रखता है. जैसे-जैसे ड्रैग शैडो इंटरसेक्ट करता है ड्रॉप टारगेट के बाउंडिंग बॉक्स का इस्तेमाल करने पर, सिस्टम एक या एक से ज़्यादा ड्रैग इवेंट टारगेट का ड्रैग इवेंट लिसनर. पॉडकास्ट सुनने वाला व्यक्ति, इवेंट के जवाब में ड्रॉप टारगेट View. उदाहरण के लिए, अगर इवेंट इससे पता चलता है कि ड्रैग शैडो, ड्रॉप के बाउंडिंग बॉक्स में प्रवेश करता है टारगेट—कार्रवाई का प्रकार ACTION_DRAG_ENTERED —लिसनर View को हाइलाइट करके, प्रतिक्रिया दे सकता है.
प्रेषित
उपयोगकर्ता, ड्रॉप के बाउंडिंग बॉक्स में ही ड्रैग शैडो छोड़ देता है टारगेट. सिस्टम, ड्रॉप टारगेट के लिसनर को कार्रवाई के साथ एक ड्रैग इवेंट भेजता है ACTION_DROP लिखें. खींचें इवेंट ऑब्जेक्ट में वह डेटा होता है जो कार्रवाई शुरू करने के लिए, startDragAndDrop() को कॉल करें. इस गाने को सुनने वाले लोग हैं अगर लिसनर सही तरीके से प्रोसेस हो जाता है, तो सिस्टम में बूलियन true रिटर्न की उम्मीद की जाती है छूटे हुए डेटा को प्रोसेस करता है. : यह चरण सिर्फ़ तब होता है, जब उपयोगकर्ता View का बाउंडिंग बॉक्स, जिसका लिसनर, ड्रैग इवेंट पाने के लिए रजिस्टर है (टारगेट कम करने के लिए). अगर उपयोगकर्ता किसी अन्य ब्राउज़र में, ड्रैग शैडो को छोड़ देता है स्थिति में, कोई ACTION_DROP ड्रैग इवेंट नहीं भेजा जाता.
खत्म

उपयोगकर्ता के खींचें शैडो रिलीज़ करने और सिस्टम की तरफ़ से भेजने के बाद

अगर ज़रूरी हो, तो सिस्टम में, कार्रवाई टाइप ACTION_DROP वाले ड्रैग इवेंट को हटाएं कार्रवाई टाइप ACTION_DRAG_ENDED के साथ एक ड्रैग इवेंट भेजता है. इससे यह पता चलता है कि खींचें और छोड़ें कार्रवाई खत्म हो गई है. ऐसा इसलिए किया जाता है, भले ही उपयोगकर्ता इससे ड्रैग शैडो रिलीज़ कर दिया जाता है. इस इवेंट को उन सभी लोगों को भेजा जाता है ड्रैग इवेंट पाने के लिए रजिस्टर किया गया हो, भले ही लिसनर को ACTION_DROP इवेंट.

इनमें से हर चरण के बारे में ज़्यादा जानकारी के लिए, खींचें और छोड़ें कार्रवाई.

इवेंट खींचें और छोड़ें

सिस्टम, DragEvent ऑब्जेक्ट के रूप में एक ड्रैग इवेंट भेजता है, जो इसमें ऐसी कार्रवाई शामिल है जो बताती है कि 'खींचें और छोड़ें' सुविधा में क्या हो रहा है प्रोसेस. कार्रवाई के टाइप के आधार पर, ऑब्जेक्ट में अन्य डेटा भी हो सकता है.

ड्रैग इवेंट लिसनर को DragEvent ऑब्जेक्ट मिलता है. कार्रवाई का टाइप जानने के लिए, लिसनर कॉल DragEvent.getAction(). DragEvent क्लास में कॉन्सटेंट के हिसाब से छह संभावित वैल्यू होती हैं. जिनकी जानकारी टेबल 1 में दी गई है:

टेबल 1. ड्रैग इवेंट की कार्रवाई के टाइप

कार्रवाई प्रकार मतलब
ACTION_DRAG_STARTED ऐप्लिकेशन startDragAndDrop() को कॉल करता है और में खींचें और छोड़ें. अगर सुनने वाला व्यक्ति, ड्रैग इवेंट पाना जारी रखना चाहता है इस कार्रवाई के लिए, इसे बूलियन true को सिस्टम.
ACTION_DRAG_ENTERED ड्रैग शैडो, ड्रैग इवेंट लिसनर के बाउंडिंग बॉक्स में प्रवेश करता है View. लिसनर का यह इवेंट की पहली कार्रवाई है बाउंडिंग बॉक्स में जाने पर ड्रैग शैडो के अंदर आने पर रिसीव किया जाता है.
ACTION_DRAG_LOCATION इसके बाद ACTION_DRAG_ENTERED इवेंट, ड्रैग शैडो अब भी है बाउंडिंग बॉक्स के अंदर View.
ACTION_DRAG_EXITED ACTION_DRAG_ENTERED और कम से कम एक को फ़ॉलो करना ACTION_DRAG_LOCATION इवेंट, ड्रैग शैडो मूव करता है ड्रैग इवेंट लिसनर के बाउंडिंग बॉक्स के बाहर View.
ACTION_DROP ड्रैग शैडो रिलीज़ होने के बाद, ड्रैग इवेंट लिसनर के ऊपर आ जाएगा View. यह कार्रवाई टाइप, View को भेजा गया है ऑब्जेक्ट का लिसनर सिर्फ़ तब, जब लिसनर बूलियन रिटर्न करता है true ACTION_DRAG_STARTED खींचें और छोड़ें. कार्रवाई का यह टाइप, यह तब भेजा जाता है, जब उपयोगकर्ता View पर ड्रैग शैडो रिलीज़ करता है जिसका लिसनर रजिस्टर नहीं किया गया है या अगर उपयोगकर्ता, ड्रैग रिलीज़ करता है उस कॉन्टेंट को शैडो करें जो मौजूदा लेआउट का हिस्सा नहीं है.

अगर श्रोता, बूलियन true दिखाता है, तो गिरावट को प्रोसेस करता है. अगर ऐसा नहीं होता है, तो इसे वापस लौटाना होगा false.

ACTION_DRAG_ENDED सिस्टम, 'खींचें और छोड़ें' कार्रवाई बंद कर रहा है. इस तरह की कार्रवाई यह ज़रूरी नहीं है कि ACTION_DROP इवेंट से पहले हो. अगर आपने सिस्टम इसे पाने के लिए, ACTION_DROP भेजता है ACTION_DRAG_ENDED की कार्रवाई टाइप का मतलब यह नहीं है कि गिरावट सफल रही. सुनने वाले को कॉल करना चाहिए getResult(), जैसा कि टेबल 2 में दिखाया गया है, ताकि आप ACTION_DROP की प्रतिक्रिया के तौर पर वापस किया गया. अगर कोई ACTION_DROP इवेंट नहीं भेजा गया. इसके बाद getResult(), false दिखाता है.

DragEvent ऑब्जेक्ट में वह डेटा और मेटाडेटा भी शामिल होता है जो आपके ऐप्लिकेशन में होता है startDragAndDrop() को किए गए कॉल में सिस्टम को उपलब्ध कराता है. कुछ डेटा ये सिर्फ़ कुछ तरह की कार्रवाइयों के लिए मान्य हैं, जैसा कि टेबल 2 में बताया गया है. ज़्यादा के लिए इवेंट और उनसे जुड़े डेटा की जानकारी के लिए, A 'खींचें और छोड़ें' कार्रवाई.

दूसरी टेबल. कार्रवाई के टाइप के हिसाब से ड्रैग इवेंट का मान्य डेटा

getAction()
वैल्यू
getClipDescription()
वैल्यू
getLocalState()
वैल्यू
getX()
वैल्यू
getY()
वैल्यू
getClipData()
वैल्यू
getResult()
वैल्यू
ACTION_DRAG_STARTED जाँच करें; जाँच करें;        
ACTION_DRAG_ENTERED जाँच करें; जाँच करें;        
ACTION_DRAG_LOCATION जाँच करें; जाँच करें; जाँच करें; जाँच करें;    
ACTION_DRAG_EXITED जाँच करें; जाँच करें;        
ACTION_DROP जाँच करें; जाँच करें; जाँच करें; जाँच करें; जाँच करें;  
ACTION_DRAG_ENDED   जाँच करें;       जाँच करें;

DragEvent तरीके getAction(), describeContents(), writeToParcel(), और toString() हमेशा मान्य डेटा दिखाएं.

अगर किसी तरीके में किसी खास कार्रवाई टाइप के लिए मान्य डेटा शामिल नहीं है, तो यह null या 0, नतीजे के टाइप के आधार पर.

शैडो को खींचें

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

इमेज को ड्रैग शैडो कहा जाता है. इसे उन तरीकों से बनाया जा सकता है जिनके लिए आपने एलान किया है एक View.DragShadowBuilder ऑब्जेक्ट है. खींचने और छोड़ने की सुविधा शुरू करने पर, बिल्डर को सिस्टम में पास किया जाता है कार्रवाई startDragAndDrop() का उपयोग करके की जा रही है. इसके जवाब के तौर पर startDragAndDrop(), सिस्टम उन कॉलबैक के तरीकों को शुरू करता है जिन्हें आपने चुना है ड्रैग शैडो पाने के लिए View.DragShadowBuilder.

View.DragShadowBuilder क्लास के दो कंस्ट्रक्टर हैं:

View.DragShadowBuilder(View)

यह कंस्ट्रक्टर आपके सभी ऐप्लिकेशन को स्वीकार करता है View ऑब्जेक्ट. कंस्ट्रक्टर स्टोर करता है View.DragShadowBuilder ऑब्जेक्ट में View ऑब्जेक्ट होता है, इसलिए कॉलबैक इसे ऐक्सेस करके, ड्रैग शैडो बनाएं. व्यू का View, जिसे उपयोगकर्ता, ड्रैग करने की कार्रवाई शुरू करने के लिए चुनता है.

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

View.DragShadowBuilder()

अगर इस कंस्ट्रक्टर का इस्तेमाल किया जाता है, तोView View.DragShadowBuilder ऑब्जेक्ट. इस फ़ील्ड को null पर सेट किया गया है. आपको अपनी सदस्यता को बढ़ाना होगा View.DragShadowBuilder और इसके तरीकों को ओवरराइड करता है. ऐसा न करने पर, आपको न दिखने वाला ड्रैग शैडो. सिस्टम गड़बड़ी नहीं दिखाता.

View.DragShadowBuilder क्लास में दो तरीके हैं, जिनसे एक साथ खींचकर चार्ट बनाया जा सकता है शैडो:

onProvideShadowMetrics()

आपके startDragAndDrop() को कॉल करने के तुरंत बाद, सिस्टम इस तरीके को कॉल करता है. ड्रैग शैडो के डाइमेंशन और टच पॉइंट को शामिल हैं. इस तरीके में दो पैरामीटर होते हैं:

outShadowSize: Point ऑब्जेक्ट है. ड्रैग शैडो की चौड़ाई x, और इसकी ऊंचाई बढ़ती है y.

outShadowTouchPoint: Point ऑब्जेक्ट. टच पॉइंट वह जगह है जहां शैडो में खींचें और छोड़ें. यह प्रोसेस करने के दौरान उपयोगकर्ता की उंगली के नीचे होना चाहिए. इसकी X स्थिति x में है और इसकी Y स्थिति y में है.

onDrawShadow()

onProvideShadowMetrics() पर कॉल करने के तुरंत बाद, सिस्टम कॉल कर देता है ड्रैग शैडो बनाने के लिए onDrawShadow(). इस तरीके में तर्क है, तो एक Canvas ऑब्जेक्ट जो सिस्टम आपके दिए गए पैरामीटर से बनता है onProvideShadowMetrics(). यह तरीका, दिए गए डाइमेंशन पर ड्रैग शैडो खींचता है Canvas.

परफ़ॉर्मेंस को बेहतर बनाने के लिए, ड्रैग शैडो का साइज़ छोटा रखें. एक सिंगल किराया आइटम, तो शायद आप किसी आइकन का उपयोग करना चाहें. एक से ज़्यादा आइटम चुनने के लिए, स्क्रीन पर पूरी इमेज फैलाने के बजाय, स्टैक में आइकॉन का इस्तेमाल करना हो.

इवेंट लिसनर और कॉलबैक तरीकों को खींचें और छोड़ें

View को, ड्रैग इवेंट लिसनर के साथ, ड्रैग इवेंट मिलते हैं जो लागू करता है View.OnDragListener या व्यू के onDragEvent() कॉलबैक तरीके का इस्तेमाल करके. टास्क कब शुरू होगा सिस्टम, तरीके या लिसनर को कॉल करता है, तो यह DragEvent आर्ग्युमेंट.

ज़्यादातर मामलों में, कॉलबैक तरीके के बजाय लिसनर का इस्तेमाल करना बेहतर होता है. टास्क कब शुरू होगा आप यूज़र इंटरफ़ेस (यूआई) डिज़ाइन करते हैं, तो आप आम तौर पर View क्लास को सब-क्लास नहीं करते, लेकिन कॉलबैक मैथड आपको उन सब-क्लास को बनाने के लिए मजबूर करता है, जिनमें तरीका बदला जा सकता है. तय सीमा में तुलना करें, तो आप एक लिसनर क्लास लागू करके उसे एक से ज़्यादा अलग-अलग View ऑब्जेक्ट हैं. इसे बिना नाम वाली इनलाइन क्लास के तौर पर भी लागू किया जा सकता है या लैम्डा एक्सप्रेशन हो सकता है. View ऑब्जेक्ट के लिए लिसनर सेट करने के लिए, कॉल करें setOnDragListener().

विकल्प के तौर पर, onDragEvent() के डिफ़ॉल्ट तरीके को लागू किया जा सकता है . एक OnReceiveContentListener व्यू पर; ज़्यादा जानकारी के लिए, इसे देखें setOnReceiveContentListener(). इसके बाद, onDragEvent() तरीका डिफ़ॉल्ट रूप से ये काम करता है:

  • startDragAndDrop() को किए गए कॉल के जवाब में 'सही' दिखाता है.
  • कॉल performReceiveContent() अगर व्यू पर खींचें और छोड़ें डेटा मौजूद है. डेटा को तरीके को ContentInfo ऑब्जेक्ट के तौर पर सबमिट करें. कॉन्टेंट बनाने तरीका OnReceiveContentListener शुरू करता है.

  • 'सही' दिखाता है अगर खींचें-और-छोड़ें डेटा व्यू पर छोड़ दिया जाता है और OnReceiveContentListener किसी भी कॉन्टेंट का इस्तेमाल करता है.

OnReceiveContentListener को परिभाषित करें, जो खास तौर पर आपके है. एपीआई लेवल 24 तक पुराने सिस्टम के साथ काम करने की सुविधा के लिए, इसके Jetpack वर्शन का इस्तेमाल करें OnReceiveContentListener.

इसमें, View ऑब्जेक्ट के लिए, ड्रैग इवेंट लिसनर और कॉलबैक का तरीका इस्तेमाल किया जा सकता है इस मामले में, सिस्टम पहले लिसनर को कॉल करता है. सिस्टम कॉलबैक का तरीका तब तक इस्तेमाल करता है, जब तक कि लिसनर false न लौटाए.

onDragEvent() तरीके और View.OnDragListener का कॉम्बिनेशन यह है जो onTouchEvent() और View.OnTouchListener टच इवेंट के साथ इस्तेमाल किया गया.