নিচের বিভাগগুলিতে টেনে নিয়ে রাখার প্রক্রিয়ার কিছু মূল ধারণা ব্যাখ্যা করা হয়েছে।
টেনে নিয়ে রাখার প্রসেস
টেনে নিয়ে রাখুন প্রসেসে চারটি ধাপ বা অবস্থা আছে: শুরু হয়েছে, চলছে, রাখা হয়েছে এবং শেষ হয়েছে।
- শুরু হয়েছে
ব্যবহারকারীর টেনে নিয়ে যাওয়ার জেসচারের উত্তরে, আপনার অ্যাপ্লিকেশন
startDragAndDrop()কল করে সিস্টেমকে টেনে নিয়ে রাখুন অপারেশন শুরু করতে বলে। The পদ্ধতির আর্গুমেন্ট নিম্নলিখিত তথ্য প্রদান করে:- ডেটা টেনে আনতে হবে।
- ড্র্যাগ শ্যাডো আঁকার জন্য কলব্যাক
- মেটাডেটা যা টেনে আনা ডেটার বিবরণ দেয়
- সিস্টেমটি ড্র্যাগ শ্যাডো পেতে আপনার অ্যাপ্লিকেশনকে কল ব্যাক করে উত্তর দেয়। সিস্টেম তখন ডিভাইসে ড্র্যাগ শ্যাডো দেখায়।
- এরপর, সিস্টেম বর্তমান লেআউটে থাকা সব
Viewঅবজেক্টের ড্র্যাগ ইভেন্ট লিসনারেACTION_DRAG_STARTEDঅ্যাকশন টাইপ সহ ড্র্যাগ ইভেন্ট পাঠায়। ড্রপ ইভেন্ট সহ ড্র্যাগ ইভেন্ট পাওয়া চালিয়ে যেতে, ড্র্যাগ ইভেন্ট লিসনারকে অবশ্যই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 ক্লাসে কনস্ট্যান্ট দ্বারা সংজ্ঞায়িত ছয়টি সম্ভাব্য মান রয়েছে,
যা সারণী ১-এ বর্ণনা করা হয়েছে:
টেবিল ১. DragEvent অ্যাকশনের ধরন
| অ্যাকশনের ধরন | অর্থ |
|---|---|
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
অবজেক্টের লিসনারকে তখনই পাঠানো হয় যখন লিসনার
ACTION_DRAG_STARTED ড্র্যাগ ইভেন্টের উত্তরে
true বুলিয়ান রিটার্ন করে। ব্যবহারকারী যদি এমন কোনও View-এর উপর ড্র্যাগ শ্যাডো রিলিজ করেন
যার লিসেনার রেজিস্টার করা নেই অথবা ব্যবহারকারী যদি বর্তমান লেআউটের অংশ নয় এমন কিছুর উপর ড্র্যাগ
শ্যাডো রিলিজ করেন, তাহলে এই অ্যাকশনের ধরন
পাঠানো হয় না।
ড্রপ প্রসেস করা সম্পূর্ণ হলে লিসেনার বুলিয়ান |
ACTION_DRAG_ENDED |
সিস্টেম টেনে নিয়ে রাখার অপারেশন শেষ করছে। এই ধরনের অ্যাকশনের
আগে ACTION_DROP ইভেন্ট নাও থাকতে পারে। সিস্টেম
ACTION_DROP পাঠালে, ACTION_DRAG_ENDED অ্যাকশন টাইপ
পাওয়ার অর্থ এই নয় যে
ড্রপ সফল হয়েছে। ACTION_DROP-এর উত্তরে যে ভ্যালু পাওয়া যায়, তা পেতে
সারণী ২-এ দেখানো
getResult()-কে লিসেনারকে কল করতে হবে। যদি কোনও
ACTION_DROP ইভেন্ট পাঠানো না হয়, তাহলে
getResult() false রিটার্ন করে।
|
DragEvent অবজেক্টে ডেটা ও মেটাডেটাও থাকে যা আপনার অ্যাপ্লিকেশন
startDragAndDrop()-এ কল করার সময় সিস্টেমকে প্রদান করে। কিছু ডেটা শুধুমাত্র নির্দিষ্ট অ্যাকশনের ধরনের জন্য
বৈধ, যেমনটি সারণী ২-এ সংক্ষিপ্ত করা হয়েছে। ইভেন্ট ও তার সাথে সম্পর্কিত ডেটা সম্পর্কে আরও
জানতে, টেনে নিয়ে রাখুন অপারেশন
নামক বিভাগটি দেখুন।
টেবিল ২. অ্যাকশনের ধরন অনুযায়ী DragEvent ডেটা যাচাই করা
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.DragShadowBuilderঅবজেক্টে কোনওViewঅবজেক্ট উপলভ্য থাকে না। ফিল্ডটি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 আর্গুমেন্ট প্রদান করে।
বেশিরভাগ ক্ষেত্রে, কলব্যাক পদ্ধতির পরিবর্তে লিসেনার ব্যবহার করা বাঞ্ছনীয়। আপনি
UI ডিজাইন করার সময় সাধারণত View ক্লাসের সাবক্লাস তৈরি করেন না, কিন্তু কলব্যাক পদ্ধতি
ব্যবহার করলে আপনাকে সাবক্লাস তৈরি করে পদ্ধতিটি ওভাররাইড করতে হয়। তুলনামূলকভাবে, আপনি একটি লিসেনার ক্লাস প্রয়োগ করতে পারেন এবং তারপরে একাধিক
বিভিন্ন View অবজেক্টের সাথে এটি ব্যবহার করতে পারেন। এছাড়াও, আপনি এটি একটি বেনামী ইনলাইন ক্লাস
বা ল্যাম্বডা এক্সপ্রেশন হিসেবে প্রয়োগ করতে পারেন। View অবজেক্টের জন্য লিসেনার সেট করতে, setOnDragListener()-কে কল করুন।
বিকল্প হিসেবে, আপনি পদ্ধতি ওভাররাইড না করেই onDragEvent()-এর ডিফল্ট ইমপ্লিমেন্টেশন
পরিবর্তন করতে পারেন। কোনও ভিউতে
OnReceiveContentListener
সেট করুন; আরও বিবরণের জন্য, setOnReceiveContentListener() দেখুন।
onDragEvent() পদ্ধতিটি ডিফল্ট হিসেবে নিম্নলিখিত কাজগুলি করে:
startDragAndDrop()-এ কল করার উত্তরে সত্য রিটার্ন করে।কল
performReceiveContent()যদি টেনে নিয়ে রাখা ডেটা ভিউতে ড্রপ করা হয়। ডেটা পদ্ধতিতেContentInfoঅবজেক্ট হিসেবে পাস করা হয়।OnReceiveContentListener-কে পদ্ধতি ট্রিগার করে।ভিউতে টেনে এনে ড্রপ করা ডেটা ড্রপ করা হলে এবং
OnReceiveContentListenerকোনও কন্টেন্ট ব্যবহার করলে, সত্য ফেরত পাঠায়।
আপনার অ্যাপের জন্য বিশেষভাবে ডেটা ম্যানেজ করতে OnReceiveContentListener ডিফাইন করুন। API লেভেল ২৪ পর্যন্ত ব্যাকওয়ার্ড কম্প্যাটিবিলিটির জন্য OnReceiveContentListener-এর Jetpack ভার্সন ব্যবহার করুন।
View অবজেক্টের জন্য আপনার কাছে ড্র্যাগ ইভেন্ট লিসনার এবং কলব্যাক পদ্ধতি থাকতে পারে, যেক্ষেত্রে সিস্টেম প্রথমে লিসনারকে কল করে। লিসেনার false রিটার্ন না করা পর্যন্ত সিস্টেম কলব্যাক পদ্ধতি কল করে না।
onDragEvent() পদ্ধতি ও View.OnDragListener-এর কম্বিনেশন
onTouchEvent()
ও View.OnTouchListener-এর কম্বিনেশনের
মতোই, যা টাচ ইভেন্টের সাথে ব্যবহার করা হয়।