Drag-and-Drop — vizual obyektni barmoq bilan ekran bo‘ylab sudrab tashlashning interaktiv jesti. Jest uch fazadan iborat: ushlash (long press yoki teginish), siljitish (barmoqning obyekt bilan harakati) va qo‘yib yuborish (maqsadli zonaga tashlash). Elementlar tartibini o‘zgartirish, fayllarni papkalar orasida ko‘chirish, interfeysni tashkil qilish (drag to reorder, drag to resize) uchun ishlatiladi. iOS-da UIDragInteraction orqali, Android-da esa DragEvent va startDragAndDrop orqali amalga oshiriladi.
Asosiy
Drag-and-Drop (DnD, sudrab tashlash) — foydalanuvchi obyektni barmoq yoki sichqoncha bilan ushlab, boshqa joyga ko‘chirib qo‘yadigan grafik interfeys elementlarini boshqarish usulidir. Mobil interfeyslarda Drag-and-Drop odatda uzoq bosish (Long Press) bilan boshlanadi — foydalanuvchi elementni 300–500 ms ushlab turadi, shundan so‘ng tizim interfeysni sudrab tashlash rejimiga o‘tkazadi va barmoq harakati obyektni o‘zi bilan olib boradi.
Tarixiy jihatdan, Drag-and-Drop ish stoli interfeyslarida (Xerox Star, 1981; Macintosh, 1984) nusxalash/joylashtirish buyruqlariga muqobil sifatida paydo bo‘ldi. Mobil platformalarda to‘liq qo‘llab-quvvatlash iOS 11 (2017) da UIDragInteraction va Android 7.0 (2016) da Multi-Window Drag-and-Drop bilan paydo bo‘ldi. Bungacha mobil ilovalarda sudrab tashlash gesture recognizers orqali maxsus yechimlar bilan amalga oshirilar edi.
Asosiy tushunchalar: drag session (sudrab tashlash sessiyasi), drag items (sudralayotgan obyektlar), drag preview (obyektning vizual ko‘rinishi), drop target (tashlash zonasi), drop proposal (tashlashdagi harakat: ko‘chirish, nusxalash, bog‘lash). Tizim sessiyani operatsion tizim darajasida boshqaradi, bu obyektlarni turli ilovalar orasida sudrab tashlash imkonini beradi (masalan, Galereyadan rasmni Eslatmalarga).
Drag-and-Drop ketma-ket uch fazaga bo‘linadi. Faza 1 — ushlash (Drag Start): foydalanuvchi jestni boshlaydi (odatda Long Press), tizim sudrab tashlash sessiyasini yaratadi, obyekt ma‘lumotlarini oladi va drag preview — barmoqni kuzatuvchi yarim shaffof element nusxasini ko‘rsatadi. Bu fazada tizim DnD tugaguncha boshqa jestlarni (aylantirish, matn tanlash) rad etadi.
Faza 2 — siljitish (Drag Move): barmoq ekranda harakatlanadi, drag preview teginish nuqtasini kuzatadi. Tizim barmoq ostidagi drop target-ni uzluksiz aniqlaydi va drag enter, drag move va drag exit hodisalarini yuboradi. Drop target vizual reaksiya berishi mumkin: yoritish, kengaytirish yoki qo‘shimcha chiziq ko‘rsatish. Bu faza vazifaning murakkabligiga qarab 0.5 dan 10+ sekundgacha davom etadi.
Faza 3 — qo‘yib yuborish (Drop): barmoq ekrandan uziladi. Tizim sudrab tashlash sessiyasini tugatadi va maqsadli elementda drop callback-ni chaqiradi. Agar drop target tashlashni rad etsa (masalan, yozish huquqi bo‘lmagan papkaga faylni sudrab tashlash), drag preview animatsiya bilan asl holatiga qaytadi (cancel animation). Agar tashlash qabul qilinsa, element asl joyidan yo‘qoladi va maqsadli joyda paydo bo‘ladi.
| Faza | iOS hodisasi | Android hodisasi | Vizual holat |
|---|---|---|---|
| Ushlash | UIDragInteractionDelegate.dragSessionWillBegin | View.OnLongClickListener → startDragAndDrop | Drag preview barmoq ostida paydo bo‘ladi |
| Siljitish | UIDropInteractionDelegate.dragSessionDidUpdate | View.OnDragListener.onDrag (ACTION_DRAG_MOVED) | Preview harakatlanadi, target yoritiladi |
| Qo‘yib yuborish | UIDropInteractionDelegate.performDrop | View.OnDragListener.onDrag (ACTION_DROP) | Tashlash yoki qaytish animatsiyasi |
Ilovalararo sudrab tashlash — ikkala platformada ham mavjud funksiya. iOS Split View va Slide Over rejimlarida (iPad) ilovalar orasida Drag-and-Drop-ni qo‘llab-quvvatlaydi. Android Split Screen rejimida ilovalar orasida sudrab tashlashni qo‘llab-quvvatlaydi. Ma‘lumotlar UIPasteConfiguration (iOS) yoki ClipData (Android) orqali uzatiladi. Dasturchi qo‘llab-quvvatlanadigan ma‘lumot turlarini (iOS uchun UTI, Android uchun MIME) belgilaydi.
UIDragInteraction — iOS 11 da qo‘shilgan iOS-ning asosiy sudrab tashlash API-si. View-dan sudrab tashlashni yoqish uchun UIDragInteraction-ni UIDragInteractionDelegate bilan qo‘shing. Delegat qaysi elementlar sudralayotganini, ularning ko‘rinishi va xatti-harakatini aniqlaydi. Elementlarni qabul qilish uchun View tashlashni qabul qila oladimi va ma‘lumotlarni qanday qayta ishlashni aniqlaydigan UIDropInteractionDelegate bilan UIDropInteraction ishlatiladi.
// UIDragInteraction — kolleksiyadan elementni sudrab tashlash
class DragViewController: UIViewController, UIDragInteractionDelegate {
@IBOutlet var dragSourceView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
let dragInteraction = UIDragInteraction(delegate: self)
dragSourceView.addInteraction(dragInteraction)
}
func dragInteraction(_ interaction: UIDragInteraction,
itemsForBeginning session: UIDragSession) -> [UIDragItem] {
guard let data = Data(contentsOf: selectedFileURL) else { return [] }
let itemProvider = NSItemProvider(object: data as NSData)
let dragItem = UIDragItem(itemProvider: itemProvider)
// Drag preview — elementning kichiklashtirilgan nusxasi
dragItem.previewProvider = {
let previewView = UIImageView(image: thumbnailImage)
previewView.alpha = 0.8
return UIDragPreview(view: previewView)
}
return [dragItem]
}
}UIDropInteractionDelegate — tashlashni qabul qilish uchun oyna interfeysi. canHandle(_:) metodi ma‘lumot turi qo‘llab-quvvatlanadimi yoki yo‘qligini tekshiradi. sessionDidUpdate(_:) vizual holatni yangilaydi (yoritish, qo‘shimcha chiziq). performDrop(_:) ma‘lumotlarning yakuniy qayta ishlanishini amalga oshiradi. iOS operatsiya turi bilan UIDropProposal-ni avtomatik chaqiradi: .move (ko‘chirish), .copy (nusxalash), .forbidden (taqiqlangan). Operatsiya turi vizual ko‘rinishga ta‘sir qiladi (nusxalash uchun preview burchagida + belgisi, forbidden uchun taqiq belgisi).
View.startDragAndDrop() — API 24 dan (Android 7.0) mavjud bo‘lgan Android SDK sudrab tashlashni boshlash metodi. Element ushlangandan keyin chaqiriladi (odatda onLongClick da). Parametrlar: ClipData (ma‘lumot), DragShadowBuilder (vizual soya), Object myLocalState (mahalliy holat), flags. DragShadowBuilder barmoqni kuzatuvchi Bitmap yaratadi. Tizim sudrab tashlash vaqtida avtomatik ravishda animatsiya va tegish hodisalarini boshqaradi.
// Drag-and-Drop elementlari tartibini o‘zgartirish bilan RecyclerView
class ReorderAdapter(private val items: MutableList<String>) :
RecyclerView.Adapter<ReorderAdapter.ViewHolder>() {
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.itemView.setOnLongClickListener {
// Ma‘lumot uzatish uchun ClipData yaratamiz
val clipData = ClipData.newPlainText("item", items[position])
// Kichiklashtirilgan preview bilan maxsus DragShadowBuilder
val shadowBuilder = object : View.DragShadowBuilder(holder.itemView) {
override fun onProvideShadowMetrics(shadowSize: Point, shadowTouchPoint: Point) {
shadowSize.set(itemView.width, itemView.height / 2)
}
}
holder.itemView.startDragAndDrop(clipData, shadowBuilder, position, 0)
true
}
}
}Android-da tashlashni qabul qilish View.setOnDragListener() orqali amalga oshiriladi. Tinglovchi ACTION_DRAG_STARTED, ACTION_DRAG_ENTERED, ACTION_DRAG_LOCATION, ACTION_DRAG_EXITED, ACTION_DROP, ACTION_DRAG_ENDED hodisalarini oladi. ACTION_DROP hodisasida ma‘lumotlar ClipData dan chiqariladi va maqsadli harakat bajariladi. RecyclerView da tartibni o‘zgartirish uchun ItemTouchHelper.SimpleCallback tavsiya etiladi — ushlash uchun Long Press-ni, elementlarning siljitish animatsiyasini va onMove/onSwiped yordamchi metodlarini avtomatik boshqaradigan o‘rnatilgan mexanizm.
Ro‘yxatlar tartibini o‘zgartirish (drag to reorder) — DnD ning eng keng tarqalgan stsenariysi: foydalanuvchi ro‘yxat elementlarini tartibini o‘zgartirish uchun sudrab tashlaydi. Misollar: sevimli kontaktlarni qayta tartiblash, trekerlarda (Trello, Todoist) vazifalarni saralash, pleylistdagi treklar tartibini o‘zgartirish (Spotify, Apple Music). Android-da ItemTouchHelper yoki iOS-da UILongPressGestureRecognizer + hujayralarni qayta tartiblash orqali amalga oshiriladi.
Fayl menejerlari — fayllarni papkalar orasida nusxalash va ko‘chirish uchun Drag-and-Drop. iOS Files App, Android Files by Google, Dropbox — barchasi DnD-ni qo‘llab-quvvatlaydi. Faylni papka ustiga sudrab tashlash uni ichkariga ko‘chiradi (move), Option/Ctrl tugmasi bilan sudrab tashlash nusxalaydi (copy). Drop target yaqinlashganda vizual yoritiladi, papka chegaralarini ko‘rsatadi.
Kanban doskalari — Trello, Jira, Notion kartalarni ustunlar orasida (To Do → In Progress → Done) ko‘chirish uchun Drag-and-Drop dan foydalanadi. Sudrab tashlash vaqtida karta manba ustundan ajraladi, barmoqni kuzatadi va boshqa ustun chegarasini kesib o‘tganda animatsiya bilan kiritiladi. iOS 11+ paralaks effekti bilan UIDragPreview-ni qo‘llab-quvvatlaydi, bunda preview teginish nuqtasidan biroz chetga chiqib, chuqurlik hosil qiladi.
Springboard bo‘limlari (iOS) — iOS bosh ekranida ilova belgilarini sudrab tashlash. Belgini uzoq bosish “jiggling” rejimini faollashtiradi (belgilar titraydi), shundan so‘ng foydalanuvchi belgilarni sahifalar orasida ko‘chirishi va papkalar yaratishi mumkin. Bu DnD ning eng murakkab UX namunalaridan biri, chunki bir vaqtning o‘zida sudrab tashlash, titrash animatsiyasi va papkalarga guruhlashni boshqarishni talab qiladi.
Vizual qayta aloqa — Drag-and-Drop uchun juda muhim. Sudralayotgan obyekt o‘zgarishi kerak: kichiklashishi (iOS: scale 0.8–0.9), yarim shaffof bo‘lishi (alpha 0.7–0.8) va soya bilan interfeysdan yuqoriga ko‘tarilishi (shadow offset). Drop target yaqinlashganda vizual reaksiya berishi kerak: yoritish (highlight), kengaytirish (expand) yoki chegaralarni ko‘rsatish (border). Bu signallarsiz foydalanuvchi obyektni qayerga tashlashi mumkinligini tushunmaydi.
Qaytish animatsiyasi (drag cancel) — agar foydalanuvchi elementni tashlash zonasidan tashqarida yoki yaroqsiz zona ustida qo‘yib yuborsa, obyekt animatsiya bilan asl holatiga qaytishi kerak. iOS UIDragInteractionDelegate kuzatish uchun dragInteraction(_:sessionDidMove:) va qaytish animatsiyasi uchun dragInteraction(_:session:willEndWith:) ni taqdim etadi. Android View.setOnDragListener ACTION_DRAG_ENDED ni oladi, bu erda ValueAnimator yoki ObjectAnimator orqali qaytish animatsiyasini boshlash mumkin.
| Tavsiya | iOS | Android |
|---|---|---|
| Jest bilan ushlash | Long Press (standart) | OnLongClickListener |
| Drag preview | UIDragItem.previewProvider | DragShadowBuilder |
| Taktil qayta aloqa | UIImpactFeedbackGenerator | HapticFeedbackConstants.LONG_PRESS |
| Qaytish animatsiyasi | UIDragPreviewTarget | ViewPropertyAnimator |
| Drop proposal | UIDropProposal (.move/.copy) | ACTION_DROP + bayroqlar |
| Ilovalararo DnD | iOS 11+ Split View (iPad) | Android 7.0+ Split Screen |
Foydalanish imkoniyati: harakat cheklovlari bo‘lgan foydalanuvchilar sudrab tashlash jestini bajara olmasligi mumkin. Ro‘yxatlar uchun “Yuqoriga/pastga ko‘chirish” tugmalari, fayllar uchun “Papkaga ko‘chirish” kontekst menyusi orqali muqobil variantlarni taqdim eting. iOS VoiceOver elementlarni ko‘chirish uchun “Drag” rotor harakatini qo‘llab-quvvatlaydi. Android TalkBack AccessibilityNodeInfo.addAction() orqali maxsus harakatlarni taqdim etadi. Nike Run Club va Apple Health standart tugmalar orqali kirish bilan dashboardda metrikalar tartibini o‘zgartirish uchun DnD dan foydalanadi.
Tez-tez so‘raladigan savollar
Drag-and-Drop-ni boshlash uchun standart jest 300–500 ms davom etadigan Long Press (uzoq bosish) dir. iOS uzun teginishni avtomatik ravishda ushlashga aylantiradigan o‘rnatilgan UIDragInteraction mexanizmidan foydalanadi. Android OnLongClickListener callbackida startDragAndDrop() ni aniq chaqirishni talab qiladi. Ba‘zi hollarda (masalan, o‘yinlarda) DnD kechikishsiz oddiy teginish bilan boshlanishi mumkin.
Ha, ilovalararo Drag-and-Drop iOS 11+ (iPad) va Android 7.0+ da qo‘llab-quvvatlanadi. iPad da sudrab tashlash Split View va Slide Over rejimida ishlaydi — foydalanuvchi Safari dan matn olib Eslatmalarga ko‘chirishi mumkin. Android da ilovalararo DnD Split Screen rejimida ishlaydi. Ma‘lumotlar UIPasteConfiguration (iOS) yoki ClipData (Android) orqali qo‘llab-quvvatlanadigan turlar (UTI, MIME) ko‘rsatilgan holda uzatiladi.
DnD va Scroll ziddiyati ushlash kechikishi orqali hal qilinadi. Agar foydalanuvchi Long Press muddati tugashidan oldin (500 ms) barmog‘ini harakatlantirishni boshlasa, jest Drag-and-Drop emas, balki aylantirish sifatida talqin qilinadi. iOS da UIDragInteraction bu ziddiyatni avtomatik ravishda cancelsTouchesInView orqali boshqaradi. Android da ItemTouchHelper chegara qiymatidan foydalanadi — agar harakat TouchSlop chegarasidan oshsa, Long Press aylantirish foydasiga bekor qilinadi.
Drag-and-Drop har qanday ma‘lumot turini qo‘llab-quvvatlaydi: matn, rasmlar, fayllar, URL, maxsus obyektlar. iOS UTI turlari bilan NSItemProvider dan foydalanadi (public.text, public.image, public.file-url). Android — MIME turlari bilan ClipData (text/plain, image/png, application/octet-stream). Maxsus ma‘lumotlar uchun Intent bilan ClipData.Item yaratiladi. Ilovalararo DnD da ma‘lumotlar universal formatlarga yig‘iladi: plain text, HTML, RTF, UIImage/PNG.
iOS da qaytish animatsiyasi UIDragPreviewTarget orqali boshqariladi — preview animatsiya bilan qaytadigan yakuniy pozitsiya. Android da elementni asl holatiga qaytarish uchun translateX/translateY bilan ViewPropertyAnimator dan foydalaning. Animatsiya vaqti — 200–300 ms easing egri chizig‘i bilan (EaseOut). UIKit jest bekor qilinganda silliq qaytadigan paralaks effekti bilan UIDragPreview-ni avtomatik qo‘shadi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.