মূল ধারণা

নিম্নলিখিত বিভাগগুলি ড্র্যাগ-এন্ড-ড্রপ প্রক্রিয়ার জন্য কয়েকটি মূল ধারণা ব্যাখ্যা করে।

ড্র্যাগ-এন্ড-ড্রপ প্রক্রিয়া

ড্র্যাগ-এন্ড-ড্রপ প্রক্রিয়ায় চারটি ধাপ বা অবস্থা রয়েছে: শুরু, অব্যাহত, ড্রপ এবং শেষ।

শুরু হয়েছে

একটি ব্যবহারকারীর টেনে আনার অঙ্গভঙ্গির প্রতিক্রিয়া হিসাবে, আপনার অ্যাপ্লিকেশন একটি ড্র্যাগ-এন্ড-ড্রপ অপারেশন শুরু করতে সিস্টেমকে বলার জন্য startDragAndDrop() কল করে। পদ্ধতির আর্গুমেন্ট নিম্নলিখিত প্রদান করে:

  • ডেটা টেনে আনতে হবে।
  • ড্র্যাগ শ্যাডো আঁকার জন্য একটি কলব্যাক
  • মেটাডেটা যা টেনে আনা ডেটা বর্ণনা করে
  • সিস্টেমটি একটি ড্র্যাগ শ্যাডো পেতে আপনার অ্যাপ্লিকেশনে ফিরে কল করে প্রতিক্রিয়া জানায়। সিস্টেম তারপর ডিভাইসে ড্র্যাগ শ্যাডো প্রদর্শন করে।
  • এর পরে, সিস্টেমটি বর্তমান লেআউটের সমস্ত 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 ক্লাসে ধ্রুবক দ্বারা সংজ্ঞায়িত ছয়টি সম্ভাব্য মান রয়েছে, যা সারণী 1 এ বর্ণিত হয়েছে:

সারণি 1. 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 উপর ড্র্যাগ শ্যাডো প্রকাশ করে। ACTION_DRAG_STARTED ড্র্যাগ ইভেন্টের প্রতিক্রিয়ায় শ্রোতা বুলিয়ান true রিটার্ন করলেই এই কর্মের ধরনটি একটি View অবজেক্টের শ্রোতার কাছে পাঠানো হয়। এই অ্যাকশন টাইপটি পাঠানো হয় না যদি ব্যবহারকারী এমন একটি View ড্র্যাগ শ্যাডো প্রকাশ করে যার শ্রোতা নিবন্ধিত নয় বা ব্যবহারকারী যদি বর্তমান লেআউটের অংশ নয় এমন কিছুর উপর ড্র্যাগ শ্যাডো প্রকাশ করে।

শ্রোতা বুলিয়ান true ফেরত দেয় যদি এটি সফলভাবে ড্রপ প্রক্রিয়া করে। অন্যথায়, এটা false ফেরত দিতে হবে.

ACTION_DRAG_ENDED সিস্টেমটি ড্র্যাগ-এন্ড-ড্রপ অপারেশন শেষ করছে। এই অ্যাকশনের ধরনটি অগত্যা একটি ACTION_DROP ইভেন্টের আগে থাকে না৷ যদি সিস্টেম একটি ACTION_DROP পাঠায়, তাহলে ACTION_DRAG_ENDED অ্যাকশন টাইপ প্রাপ্ত করার অর্থ এই নয় যে ড্রপ সফল হয়েছে৷ শ্রোতাকে অবশ্যই getResult() কল করতে হবে, যেমনটি টেবিল 2 -এ দেখানো হয়েছে, ACTION_DROP এর প্রতিক্রিয়ায় যে মান ফেরত দেওয়া হয়েছে তা পেতে। যদি একটি ACTION_DROP ইভেন্ট পাঠানো না হয়, তাহলে getResult() false ফেরত দেয়।

DragEvent অবজেক্টে ডেটা এবং মেটাডেটাও রয়েছে যা আপনার অ্যাপ্লিকেশনটি startDragAndDrop() কলে সিস্টেমকে সরবরাহ করে। কিছু ডেটা শুধুমাত্র নির্দিষ্ট ক্রিয়াকলাপের জন্য বৈধ, যেমনটি সারণী 2-এ সংক্ষিপ্ত করা হয়েছে। ইভেন্ট এবং তাদের সম্পর্কিত ডেটা সম্পর্কে আরও তথ্যের জন্য, একটি ড্র্যাগ-এন্ড-ড্রপ অপারেশন নামক বিভাগটি দেখুন।

সারণী 2. অ্যাকশনের ধরন অনুসারে বৈধ 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 অবজেক্টটিকে View.DragShadowBuilder অবজেক্টে সংরক্ষণ করে, যাতে কলব্যাকগুলি ড্র্যাগ শ্যাডো তৈরি করতে এটি অ্যাক্সেস করতে পারে। ভিউটি এমন একটি 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 স্তর 24-এ নিচের দিকের সামঞ্জস্যের জন্য, OnReceiveContentListener এর Jetpack সংস্করণ ব্যবহার করুন।

আপনার কাছে একটি ড্র্যাগ ইভেন্ট লিসেনার এবং একটি View অবজেক্টের জন্য একটি কলব্যাক পদ্ধতি থাকতে পারে, এই ক্ষেত্রে সিস্টেমটি প্রথমে শ্রোতাকে কল করে। শ্রোতা false ফেরত না দিলে সিস্টেমটি কলব্যাক পদ্ধতিতে কল করে না।

onDragEvent() পদ্ধতি এবং View.OnDragListener এর সমন্বয় টাচ ইভেন্টের সাথে ব্যবহৃত onTouchEvent() এবং View.OnTouchListener এর সংমিশ্রণের অনুরূপ।