Drag-and-Drop — mahiyyəti, mobil tətbiqlərdə Drag and Drop

Müəllif: IT Sectr Dərc olunub: 2026-02-27 Oxuma vaxtı: 9 dəq

Drag-and-Drop — vizual obyekti barmaqla ekranda sürükləmək üçün interaktiv jestdir. Jest üç fazadan ibarətdir: tutma (long press və ya toxunma), hərəkət etdirmə (barmağın obyektlə hərəkəti) və buraxma (hədəf zonaya atma). Elementlərin sırasını dəyişmək, faylları qovluqlar arasında köçürmək, interfeysi təşkil etmək (drag to reorder, drag to resize) üçün istifadə olunur. iOS-da UIDragInteraction, Android-də isə DragEvent və startDragAndDrop vasitəsilə həyata keçirilir.

Başlıca

  • Üç faza — Drag-and-Drop tutma, hərəkət etdirmə və obyektin buraxılmasından ibarətdir
  • UIDragInteraction — sürükləməni başlatmaq vɘ idarə etmək üçün iOS-un əsas sinfi
  • startDragAndDrop — tutmadan sonra sürükləməyə başlamaq üçün Android View metodudur
  • Drag shadow — sürüklənən obyektin barmağı izləyən vizual kölgəsi
  • Drop target — sürüklənən obyektin üzərinə gətirildikdə işıqlanan buraxma zonası

Drag-and-Drop nədir?

Drag-and-Drop (DnD, sürükləmə) — istifadəçinin obyekti barmaq və ya siçanla tutub başqa yerə daşıdığı və buraxdığı qrafik interfeys elementlərinin idarə edilməsi üsuludur. Mobil interfeyslərdə Drag-and-Drop adətən uzun basma (Long Press) ilə başladılır — istifadəçi elementi 300–500 ms saxlayır, bundan sonra sistem interfeysi sürükləmə rejiminə keçirir və barmağın hərəkəti obyekti özü ilə aparır.

Tarixi olaraq Drag-and-DDrop masaüstü interfeyslərdə (Xerox Star, 1981; Macintosh, 1984) köçür/yapışdır əmrlərinə alternativ olaraq meydana çıxdı. Mobil platformalarda tam dəstək iOS 11 (2017) ilə UIDragInteraction və Android 7.0 (2016) ilə Multi-Window Drag-and-Drop-da peyda oldu. Bundan əvvəl mobil tətbiqlərdə sürükləmə gesture recognizers vasitəsilə xüsusi həllərlə həyata keçirilirdi.

Əsas anlayışlar: drag session (sürükləmə sessiyası), drag items (sürüklənən obyektlər), drag preview (obyektin vizual görüntüsü), drop target (buraxma zonası), drop proposal (buraxma zamanı hərəkət: köçür, kopyala, əlaqələndir). Sistem sessiyanı əməliyyat sistemi səviyyəsində idarə edir ki, bu da obyektlərin müxtəlif tətbiqlər arasında sürüklənməsinə imkan verir (məsələn, Qalereyadan şəkili Qeydlərə).

Drag-and-Drop fazaları

Drag-and-Drop ardıcıl üç fazaya bölünür. Faza 1 — tutma (Drag Start): istifadəçi jesti başlatır (adətən Long Press), sistem sürükləmə sessiyası yaradır, obyektin məlumatlarını əldə edir və drag preview — barmağı izləyən yarımşfaf element surətini göstərir. Bu fazada sistem DnD tamamlanana qədər digər jestləri (sürüşdürmə, mətn seçmə) rədd edir.

Faza 2 — hərəkət etdirmə (Drag Move): barmaq ekranda hərəkət edir, drag preview toxunma nöqtəsini izləyir. Sistem barmağın altındakı drop target-i davamlı müyyənləşdirir və drag enter, drag move və drag exit hadisələrini göndərir. Drop target vizual reaksiya verə bilər: işıqlana, genişlənə və ya əlavə xətti göstərə bilər. Bu faza tapşırığın mürəkkəbliyindən asılı olaraq 0.5-dən 10+ saniyəyə qədər davam edir.

Faza 3 — buraxma (Drop): barmaq ekrandan ayrılır. Sistem sürükləmə sessiyasını bitirir və hədəf elementdə drop callback-i çağırır. Drop target buraxmanı rədd edərsə (məsələn, yazma icazəsi olmayan qovluğa fayl sürükləmək), drag preview animasiya ilə əsl vəziyyətinə qayıdır (cancel animation). Buraxma qəbul edilɐrsə, element əsl vəziyyətdən yox olur və hədəf yerində görünür.

FazaiOS hadisəsiAndroid hadisəsiVizual vəziyyət
TutmaUIDragInteractionDelegate.dragSessionWillBeginView.OnLongClickListener → startDragAndDropDrag preview barmağın altında görünür
HərəkətUIDropInteractionDelegate.dragSessionDidUpdateView.OnDragListener.onDrag (ACTION_DRAG_MOVED)Preview hərəkət edir, target işıqlanır
BuraxmaUIDropInteractionDelegate.performDropView.OnDragListener.onDrag (ACTION_DROP)Buraxma və ya qayıtma animasiyası

Tətbiqlərarası sürükləmə — hər iki platformada mövcud olan funksiya. iOS Split View və Slide Over rejimlərində (iPad) tətbiqlər arasında Drag-and-Drop-u dəstəkləyir. Android Split Screen rejimində tətbiqlər arasında sürükləməni dəstəkləyir. Məlumatlar UIPasteConfiguration (iOS) və ya ClipData (Android) vasitəsilə ötürülür. Tərtibatçı dəstəklənən məlumat növlərini (iOS üçün UTI, Android üçün MIME) göstərir.

iOS-da Drag-and-Drop: UIDragInteraction

UIDragInteraction — iOS 11-də əlavə edilmiş iOS-un əsas sürükləmə API-sidir. View-dən sürükləməni aktivləşdirmək üçün UIDragInteraction-i UIDragInteractionDelegate ilə əlavə edin. Deleqat hansı elementlərin sürükləndiyini, onların görünüşünü və davranışını müyyənləşdirir. Elementləri qəbul etmək üçün View-in buraxmanı qəbul edib-edə bilmədiyini və məlumatların necə emal ediləcəyini təyin edən UIDropInteractionDelegate ilə UIDropInteraction istifadə olunur.

swift
// UIDragInteraction — kolleksiyadan elementin sürüklənməsi
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 — elementin kiçildilmiş surəti
        dragItem.previewProvider = {
            let previewView = UIImageView(image: thumbnailImage)
            previewView.alpha = 0.8
            return UIDragPreview(view: previewView)
        }
        return [dragItem]
    }
}

UIDropInteractionDelegate — buraxmanı qəbul etmək üçün güzgü interfeys. canHandle(_:) metodu məlumat növünün dəstəklənib-dəstəklənmədiyini yoxlayır. sessionDidUpdate(_:) vizual olaraq vəziyyəti yeniləyir (işıqlanma, əlavə xətt). performDrop(_:) məlumatların son emalını həyata keçirir. iOS əməliyyat növü ilə UIDropProposal-ı avtomatik çağırır: .move (köçür), .copy (kopyala), .forbidden (qadağandır). Əməliyyat növü vizual göstərimə təsir edir (kopyalama üçün preview küncündə + işarəsi, forbidden üçün qadağan işarəsi).

Android-də Drag-and-Drop: startDragAndDrop

View.startDragAndDrop() — API 24-dən (Android 7.0) mövcud olan Android SDK-nın sürükləməyə başlama metodu. Element tutulduqdan sonra çağırılır (adətən onLongClick-də). Parametrlər: ClipData (məlumat), DragShadowBuilder (vizual kölgə), Object myLocalState (yerli vəziyyət), flags. DragShadowBuilder barmağı izləyən Bitmap yaradır. Sistem sürükləmə zamanı avtomatik olaraq animasiya və toxunma hadisələrini idarə edir.

kotlin
// Drag-and-Drop elementlərin sıralanmasını dəyişməklə RecyclerView
class ReorderAdapter(private val items: MutableList<String>) :
    RecyclerView.Adapter<ReorderAdapter.ViewHolder>() {

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.itemView.setOnLongClickListener {
            // Məlumat ötürmək üçün ClipData yaradırıq
            val clipData = ClipData.newPlainText("item", items[position])

            // Kiçildilmiş preview ilə xüsusi 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-də buraxmanın qəbulu View.setOnDragListener() vasitəsilə həyata keçirilir. Dinləyici ACTION_DRAG_STARTED, ACTION_DRAG_ENTERED, ACTION_DRAG_LOCATION, ACTION_DRAG_EXITED, ACTION_DROP, ACTION_DRAG_ENDED hadisələrini alır. ACTION_DROP hadisəsində məlumatlar ClipData-dan çıxarılır və hədəf əməliyyat yerinə yetirilir. RecyclerView-də sıralamanı dəyişmək üçün ItemTouchHelper.SimpleCallback tövsiyə olunur — tutma üçün Long Press-i, elementlərin hərəkət animasiyasını və onMove/onSwiped köməkçi metodlarını avtomatik idarə edən daxili mexanizm.

Drag-and-Drop tətbiq ssenariləri

Siyahıların sıralanmasının dəyişdirilməsi (drag to reorder) — DnD-nin ən geniş yayılmış ssenarisi: istifadəçi siyahı elementlərini sıralamanı dəyişmək üçün sürükləyir. Nümunələr: seçilmiş kontaktların yerlərinin dəyişdirilməsi, tracker-lərdə (Trello, Todoist) tapşırıqların çeşidlənməsi, pleylistdə treklərin sırasının dəyişdirilməsi (Spotify, Apple Music). Android-də ItemTouchHelper və ya iOS-da UILongPressGestureRecognizer + xanaların yerlərinin dəyişdirilməsi ilə həyata keçirilir.

Fayl menecerləri — faylları qovluqlar arasında köçürmək və kopyalamaq üçün Drag-and-Drop. iOS Files App, Android Files by Google, Dropbox — hamısı DnD-ni dəstəkləyir. Faylı qovluğun üzərinə sürükləmək onu içəri köçürür (move), Option/Ctrl düməsi ilə sürükləmə kopyalayır (copy). Drop target üzərinə gətirildikdə qovluğun sərhədlərini göstərərək vizual işıqlanır.

Kanban panoları — Trello, Jira, Notion kartları sütunlar arasında (To Do → In Progress → Done) daşımaq üçün Drag-and-Drop-dan istifadə edir. Sürükləmə zamanı kart mənbə sütundan ayrılır, barmağı izləyir və başqa sütunun sərhəddini keçdikdə animasiya ilə daxil edilir. iOS 11+ paralaks effekti ilə UIDragPreview-u dəstəkləyir, burada preview toxunma nöqtəsindən bir qədər kənara çıxaraq dərinlik yaradır.

Springboard bölmələri (iOS) — iOS əsas ekranında tətbiq nişanlarının sürüklənməsi. Nişanı uzun basmaq „jiggling” rejimini aktivləşdirir (nişanlar titrəyir), bundan sonra istifadəçi nişanları səhifələr arasında daşıya və qovluqlar yarada bilər. Bu, DnD-nin ən mürəkkəb UX nümunələrindən biridir, çünki eyni anda sürükləmə, titrəmə animasiyası və qovluqlara qruplaşdırma tələb edir.

Drag-and-Drop üçün UX tövsiyələri

Vizual əks əlaqə — Drag-and-Drop üçün kritik əhəmiyyət kəsb edir. Sürüklənən obyekt dəyişməlidir: kiçilməli (iOS: scale 0.8–0.9), yarımşfaf olmalı (alpha 0.7–0.8) və kölgə ilə interfeysdən yuxarı qalxmalıdır (shadow offset). Drop target üzərinə gətirildikdə vizual reaksiya verməlidir: işıqlanma (highlight), genişlənmə (expand) və ya sərhəd göstərmə (border). Bu siqnallar olmadan istifadəçi obyekti hara buraxa biləcəyini başa düşmür.

Qayıtma animasiyası (drag cancel) — istifadəçi elementi buraxma zonasından kənarda və ya etibarsız zonanın üzərində buraxarsa, obyekt animasiya ilə əsl vəziyyətinə qayıtmalıdır. iOS UIDragInteractionDelegate dragInteraction(_:sessionDidMove:) izləmə üçün və dragInteraction(_:session:willEndWith:) qayıtma animasiyası üçün təqdim edir. Android View.setOnDragListener ACTION_DRAG_ENDED alır, burada ValueAnimator və ya ObjectAnimator vasitəsilə qayıtma animasiyası başladıla bilər.

TövsiyəiOSAndroid
Jestlə tutmaLong Press (standart)OnLongClickListener
Drag previewUIDragItem.previewProviderDragShadowBuilder
Toxunma əks əlaqəsiUIImpactFeedbackGeneratorHapticFeedbackConstants.LONG_PRESS
Qayıtma animasiyasıUIDragPreviewTargetViewPropertyAnimator
Drop proposalUIDropProposal (.move/.copy)ACTION_DROP + bayraqlar
Tətbiqlərarası DnDiOS 11+ Split View (iPad)Android 7.0+ Split Screen

Əlçatanlıq: motor məhdudiyyəti olan istifadəçilər sürükləmə jestini yerinə yetirə bilməyə bilər. Siyahılar üçün “Yuxarı/Aşağı apar” düymələri, fayllar üçün “Qovluğa apar” kontekst menyusu vasitəsilə alternativlər təmin edin. iOS VoiceOver elementləri daşımaq üçün “Drag” rotor hərəkətini dəstəkləyir. Android TalkBack AccessibilityNodeInfo.addAction() vasitəsilə xüsusi hərəkətləri təmin edir. Nike Run Club və Apple Health standart düymələr vasitəsilə girişlə dashboard-da metriklərin sıralanmasını dəyişmək üçün DnD-dan istifadə edir.

Tez-tez verilən suallar

Drag-and-Drop-u başlatmaq üçün hansı jest istifadə olunur?

Drag-and-Drop-u başlatmaq üçün standart jest 300–500 ms davam edən Long Press (uzun basma)dır. iOS avtomatik olaraq uzun toxunmanı tutmaya çevirən daxili UIDragInteraction mexanizmindən istifadə edir. Android OnLongClickListener callbackində startDragAndDrop()-ın açıq şəkildə çağırılmasını tələb edir. Bəzi hallarda (məsələn, oyunlarda) DnD gecikməsiz adi toxunma ilə başlaya bilər.

Obyektləri müxtəlif tətbiqlər arasında sürükləmək olarmı?

Bəli, tətbiqlərarası Drag-and-Drop iOS 11+ (iPad) və Android 7.0+-də dəstəklənir. iPad-də sürükləmə Split View və Slide Over rejimində işləyir — istifadəçi Safari-dən mətn götürük Qeydlərə apara bilər. Android-də tətbiqlər arasında DnD Split Screen rejimində işləyir. Məlumatlar UIPasteConfiguration (iOS) və ya ClipData (Android) vasitəsilə dəstəklənən növlər (UTI, MIME) göstərilməklə ötürülür.

Drag-and-Drop-un sürüşdürmə ilə ziddiyyətinin qarşısını necə almaq olar?

DnD və Scroll ziddiyyəti tutma gecikməsi ilə həll edilir. Əgər istifadəçi Long Press vaxtı bitməmişdən (500 ms) barmağını hərəkət etdirməyə başlayarsa, jest Drag-and-Drop deyil, sürüşdürmə kimi şərh edilir. iOS-da UIDragInteraction bu ziddiyyəti avtomatik olaraq cancelsTouchesInView vasitəsilə idarə edir. Android-də ItemTouchHelper hədd dəyəri istifadə edir — hərəkət TouchSlop həddini keçərsə, Long Press sürüşdürmə lehinə ləğv edilir.

Sürükləmə zamanı hansı məlumatlar ötürülə bilər?

Drag-and-Drop istənilən məlumat növünü dəstəkləyir: mətn, şəkillər, fayllar, URL, xüsusi obyektlər. iOS UTI növləri ilə NSItemProvider-dan istifadə edir (public.text, public.image, public.file-url). Android — MIME növləri ilə ClipData (text/plain, image/png, application/octet-stream). Xüsusi məlumatlar üçün Intent ilə ClipData.Item yaradılır. Tətbiqlərarası DnD zamanı məlumatlar universal formatlara yığılır: plain text, HTML, RTF, UIImage/PNG.

Drag-and-Drop ləğv edildikdə elementin qayıtmasını necə animasiya etmək olar?

iOS-da qayıtma animasiyası UIDragPreviewTarget vasitəsilə idarə olunur — preview-in animasiya ilə qayıtdığı son mövqe. Android-də elementi əsl vəziyyətinə qaytarmaq üçün ViewPropertyAnimator translateX/translateY ilə istifadə edin. Animasiya müddəti — 200–300 ms easing əyrisi ilə (EaseOut). UIKit jest ləğv edildikdə hamar şəkildə qayıdan paralaks effekti ilə UIDragPreview-i avtomatik əlavə edir.

Nəticə

  • Drag-and-Drop — üç fazalı obyektlərin sürüklənmə üsulu: tutma, hərəkət etdirmə, buraxma
  • Başlatma — adətən sürüşdürmədən fərqləndirmək üçün Long Press (300–500 ms)
  • iOS API — UIDragInteraction (mənbə) + UIDropInteraction (qəbuledici)
  • Android API — View.startDragAndDrop() (mənbə) + View.setOnDragListener (qəbuledici)
  • ItemTouchHelper — RecyclerView-də sıralamanı dəyişmək üçün hazır Android həlli
  • Drag preview — yarımşfaf lıqla barmağı izləyən obyektin vizual kölgəsi
  • Qayıtma animasiyası — aydın UX üçün etibarsız zonadan kənarda buraxıldıqda məcburidir

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun