नीचे दिए गए सेक्शन, खींचने और छोड़ने की प्रोसेस के कुछ मुख्य सिद्धांतों के बारे में बताते हैं.
'खींचें और छोड़ें' प्रोसेस
'खींचें और छोड़ें' प्रोसेस में चार चरण या स्थितियां होती हैं: शुरू, जारी है, छोड़ा गया, और खत्म हुआ.
- शुरू किया गया
उपयोगकर्ता के ड्रैग जेस्चर की प्रतिक्रिया में, आपका ऐप्लिकेशन कॉल करता है सिस्टम को खींचें और छोड़ें कार्रवाई शुरू करने का निर्देश देने के लिए
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 में दी गई है:
कार्रवाई प्रकार | मतलब |
---|---|
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 पर ड्रैग शैडो रिलीज़ करता है
जिसका लिसनर रजिस्टर नहीं किया गया है या अगर उपयोगकर्ता, ड्रैग रिलीज़ करता है
उस कॉन्टेंट को शैडो करें जो मौजूदा लेआउट का हिस्सा नहीं है.
अगर श्रोता, बूलियन |
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
टच इवेंट के साथ इस्तेमाल किया गया.