মূল ধারণা

Compose-এর মাধ্যমে চেষ্টা করুন
Jetpack Compose হল Android-এর জন্য সাজেস্ট করা UI টুলকিট। Compose-এ কীভাবে টেনে নিয়ে রাখবেন তা জানুন।

নিচের বিভাগগুলিতে টেনে নিয়ে রাখার প্রক্রিয়ার কিছু মূল ধারণা ব্যাখ্যা করা হয়েছে।

টেনে নিয়ে রাখার প্রসেস

টেনে নিয়ে রাখুন প্রসেসে চারটি ধাপ বা অবস্থা আছে: শুরু হয়েছে, চলছে, রাখা হয়েছে এবং শেষ হয়েছে।

শুরু হয়েছে

ব্যবহারকারীর টেনে নিয়ে যাওয়ার জেসচারের উত্তরে, আপনার অ্যাপ্লিকেশন 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-এর উপর ড্র্যাগ শ্যাডো রিলিজ করেন যার লিসেনার রেজিস্টার করা নেই অথবা ব্যবহারকারী যদি বর্তমান লেআউটের অংশ নয় এমন কিছুর উপর ড্র্যাগ শ্যাডো রিলিজ করেন, তাহলে এই অ্যাকশনের ধরন পাঠানো হয় না।

ড্রপ প্রসেস করা সম্পূর্ণ হলে লিসেনার বুলিয়ান true রিটার্ন করে। অন্যথায়, এটি অবশ্যই false রিটার্ন করবে।

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-এর কম্বিনেশনের মতোই, যা টাচ ইভেন্টের সাথে ব্যবহার করা হয়।