টানা এবং পতন

জেটপ্যাক কম্পোজ দুটি সংশোধক সহ টেনে আনে এবং ড্রপ সমর্থন করে:

  • dragAndDropSource : ড্র্যাগ অঙ্গভঙ্গির প্রারম্ভিক বিন্দু হিসাবে একটি কম্পোজেবল নির্দিষ্ট করে
  • dragAndDropTarget : একটি কম্পোজেবল নির্দিষ্ট করে যা বাদ দেওয়া ডেটা গ্রহণ করে

উদাহরণ স্বরূপ, ব্যবহারকারীদের আপনার অ্যাপে একটি ছবি টেনে আনতে সক্ষম করতে, কম্পোজযোগ্য একটি ছবি তৈরি করুন এবং dragAndDropSource মডিফায়ার যোগ করুন। একটি ড্রপ টার্গেট সেট আপ করতে, কম্পোজযোগ্য আরেকটি ইমেজ তৈরি করুন এবং dragAndDropTarget সংশোধক যোগ করুন।

মডিফায়ারগুলি একাধিক ড্র্যাগ উত্স এবং একাধিক ড্রপ লক্ষ্যগুলিতে প্রয়োগ করা যেতে পারে।

সংশোধকগুলি ClipData ব্যবহার করে দুই বা ততোধিক কম্পোজেবলের মধ্যে ডেটা ভাগ করতে অ্যাপ্লিকেশনগুলিকে সক্ষম করে, যা View বাস্তবায়নের সাথে ইন্টারঅপারেবল৷

একটি ড্র্যাগ ইভেন্ট শুরু করুন

একটি উপাদানের ভিতরে ড্র্যাগ ইভেন্টগুলি সক্ষম করতে, dragAndDropSource সংশোধক যোগ করুন, যা একটি প্যারামিটার হিসাবে একটি স্থগিত ফাংশন নেয়। ফাংশনটি ব্যবহারকারীর মিথস্ক্রিয়াকে সংজ্ঞায়িত করে যা ড্র্যাগ অপারেশন শুরু করে। dragAndDropSource সংশোধক একটি পয়েন্টার ইনপুট ইভেন্ট না পাওয়া পর্যন্ত অপেক্ষা করে এবং তারপর ইভেন্ট হ্যান্ডলারে পাস করা ল্যাম্বডা কার্যকর করে। বিভিন্ন ধরনের ইনপুট ইভেন্ট সনাক্ত করতে ল্যাম্বডা ব্যবহার করুন, উদাহরণস্বরূপ, ট্যাপ বা দীর্ঘ প্রেস। আরও তথ্যের জন্য, রচনায় পয়েন্টার ইনপুট দেখুন।

পয়েন্টার ইনপুট ইভেন্ট সাধারণত একটি দীর্ঘ প্রেস নিম্নরূপ প্রয়োগ করা হয়:

Modifier.dragAndDropSource {
    detectTapGestures(onLongPress = {
        // Transfer data here.
    })
}

একটি ড্র্যাগ-এন্ড-ড্রপ সেশন শুরু করতে, startTransfer() ফাংশনটি কল করুন। এই সুযোগের ভিতরে, স্থানান্তরযোগ্য ডেটা উপস্থাপন করতে DragAndDropTransferData ব্যবহার করুন। ডেটা একটি দূরবর্তী URI, ক্লিপবোর্ডে সমৃদ্ধ পাঠ্য ডেটা, একটি স্থানীয় ফাইল বা আরও অনেক কিছু হতে পারে, তবে সেগুলিকে একটি ClipData অবজেক্টে মোড়ানো প্রয়োজন৷ সাধারণ পাঠ্য প্রদান করুন, উদাহরণস্বরূপ, নিম্নরূপ:

Modifier.dragAndDropSource {
    detectTapGestures(onLongPress = {
        startTransfer(
            DragAndDropTransferData(
                ClipData.newPlainText(
                    "image Url", url
                )
            )
        )
    })
}

ড্র্যাগ অ্যাকশনকে অ্যাপের সীমানা অতিক্রম করার অনুমতি দিতে, DragAndDropTransferData কনস্ট্রাক্টর একটি flags আর্গুমেন্ট গ্রহণ করে। নিম্নলিখিত উদাহরণে, DRAG_FLAG_GLOBAL ধ্রুবকটি নির্দিষ্ট করে যে ডেটা একটি অ্যাপ থেকে অন্য অ্যাপে টেনে আনা যেতে পারে:

Modifier.dragAndDropSource {
    detectTapGestures(onLongPress = {
        startTransfer(
            DragAndDropTransferData(
                ClipData.newPlainText(
                    "image Url", url
                ),
                flags = View.DRAG_FLAG_GLOBAL
            )
        )
    })
}

DragAndDropTransferData Android ভিউ সিস্টেম দ্বারা সমর্থিত পতাকা গ্রহণ করে। উপলব্ধ পতাকার একটি সম্পূর্ণ তালিকার জন্য দেখুন ধ্রুবকের তালিকা দেখুন।

ড্রপ ডেটা গ্রহণ করুন

ড্র্যাগ-এন্ড-ড্রপ ইভেন্টগুলি পেতে কম্পোজেবলকে সক্ষম করার জন্য একটি কম্পোজেবলে dragAndDropTarget সংশোধককে বরাদ্দ করুন। সংশোধকের দুটি পরামিতি রয়েছে: প্রথমটি একটি ফিল্টার হিসাবে কাজ করে এবং সংশোধক কোন ধরণের ডেটা গ্রহণ করতে পারে তা নির্দিষ্ট করে এবং দ্বিতীয়টি কলব্যাকে ডেটা সরবরাহ করে৷

নোট করুন যে কলব্যাক উদাহরণ মনে রাখা উচিত। নিম্নলিখিত স্নিপেট দেখায় কিভাবে কলব্যাক মনে রাখবেন:

val callback = remember {
    object : DragAndDropTarget {
        override fun onDrop(event: DragAndDropEvent): Boolean {
            // Parse received data
            return true
        }
    }
}

পরবর্তী স্নিপেট দেখায় কিভাবে ড্রপ প্লেইন টেক্সট পরিচালনা করতে হয়:

Modifier.dragAndDropTarget(
    shouldStartDragAndDrop = { event ->
        event.mimeTypes().contains(ClipDescription.MIMETYPE_TEXT_PLAIN)
    }, target = callback
)

কলব্যাক ফাংশনটি true হওয়া উচিত যদি ইভেন্টটি গ্রাস করা হয়, অথবা যদি ইভেন্টটি প্রত্যাখ্যান করা হয় এবং মূল উপাদানে প্রচার না করে false

ড্র্যাগ-এন্ড-ড্রপ ইভেন্টগুলি পরিচালনা করুন

UI এবং অ্যাপের আচরণের সুনির্দিষ্ট নিয়ন্ত্রণের জন্য একটি ড্র্যাগ-এন্ড-ড্রপ ইভেন্ট কখন শুরু হয়, শেষ হয় বা একটি উপাদানে প্রবেশ করে বা প্রস্থান করে তা পর্যবেক্ষণ করতে DragAndDropTarget ইন্টারফেসে কলব্যাকগুলি ওভাররাইড করুন:

object : DragAndDropTarget {
    override fun onStarted(event: DragAndDropEvent) {
        // When the drag event starts
    }

    override fun onEntered(event: DragAndDropEvent) {
        // When the dragged object enters the target surface
    }

    override fun onEnded(event: DragAndDropEvent) {
        // When the drag event stops
    }

    override fun onExited(event: DragAndDropEvent) {
        // When the dragged object exits the target surface
    }

    override fun onDrop(event: DragAndDropEvent): Boolean = true
}

অতিরিক্ত সম্পদ

কোডল্যাব: কম্পোজে টেনে আনুন