Aşağıdaki bölümlerde, sürükle ve bırak işlemiyle ilgili birkaç önemli kavram açıklanmaktadır.
Sürükle ve bırak işlemi
Sürükle ve bırak işleminde dört adım veya durum vardır: başladı, devam ediyor, bırakıldı ve sona erdi.
- Başladı
- Uygulamanız, kullanıcının sürükleme hareketine yanıt olarak sisteme sürükle ve bırak işlemi başlatmasını söylemek için - startDragAndDrop()işlevini çağırır. Yöntemin bağımsız değişkenleri şunları sağlar:- Sürüklenecek veriler.
- Sürükle gölgesini çizmek için geri çağırma işlevi
- Sürüklenen verileri açıklayan meta veriler
- Sistem, sürükle gölgesi almak için uygulamanızı geri arayarak yanıt verir. Sistem daha sonra cihazda sürükleme gölgesini gösterir.
- Ardından sistem, mevcut düzendeki tüm Viewnesnelerinin sürükle etkinliği dinleyicisineACTION_DRAG_STARTEDişlem türüne sahip bir sürükle etkinliği gönderir. Olası bir bırakma etkinliği de dahil olmak üzere sürükleme etkinliklerini almaya devam etmek için sürükleme etkinliği işleyicisinintruedöndürmesi gerekir. Bu işlem, dinleyiciyi sisteme kaydeder. Yalnızca kayıtlı dinleyiciler sürükleme etkinliklerini almaya devam eder. Bu noktada dinleyiciler, görünümün bir bırakma etkinliğini kabul edebildiğini göstermek için bırakma hedefiViewnesnelerinin görünümünü de değiştirebilir.
- Sürükleme etkinliği dinleyicisi falsedöndürürse sistem,ACTION_DRAG_ENDEDişlem türüne sahip bir sürükleme etkinliği gönderene kadar geçerli işlem için sürükleme etkinliği almaz. Dinleyici,falsedöndürerek sisteme sürükle ve bırak işlemiyle ilgilenmediğini ve sürüklenen verileri kabul etmek istemediğini bildirir.
 
- Devam ediyor
- Kullanıcı sürüklemeye devam eder. Sürükleme gölgesi, bir bırakma hedefinin sınır kutusuyla kesiştiğinde sistem, hedefin sürükleme etkinliği işleyicisine bir veya daha fazla sürükleme etkinliği gönderir. İşleyici, etkinliğe yanıt olarak bırakma hedefinin Viewgörünümünü değiştirebilir. Örneğin, etkinlik, sürükleme gölgesinin bırakma hedefinin sınır kutusuna girdiğini gösteriyorsa (işlem türüACTION_DRAG_ENTERED) dinleyici,Viewöğesini vurgulayarak tepki verebilir.
- Atıldı
- Kullanıcı, bir bırakma hedefinin sınır kutusu içinde sürükleme gölgesini bırakır. Sistem, bırakma hedefinin dinleyicisine ACTION_DROPişlem türüne sahip bir sürükleme etkinliği gönderir. Sürükle etkinliği nesnesi, işlemi başlatanstartDragAndDrop()çağrısında sisteme iletilen verileri içerir. Dinleyici, bırakılan verileri başarıyla işlerse sistemetrueboole değerini döndürmelidir. : Bu adım yalnızca kullanıcı, sürükleme gölgesini dinleyicisi sürükleme etkinliklerini alacak şekilde kayıtlı birView'nin (bir bırakma hedefi) sınır kutusu içine bırakırsa gerçekleşir. Kullanıcı başka bir durumda sürükleme gölgesini bırakırsaACTION_DROPsürükleme etkinliği gönderilmez.
- Sona erdi
- Kullanıcı sürükleme gölgesini bıraktıktan ve sistem - ACTION_DROPişlem türüne sahip bir sürükle etkinliği gönderir. Gerekirse sistem, sürükle ve bırak işleminin sona erdiğini belirtmek için- ACTION_DRAG_ENDEDişlem türüne sahip bir sürükle etkinliği gönderir. Bu işlem, kullanıcının sürükleme gölgesini nerede bıraktığına bakılmaksızın yapılır. Etkinlik,- ACTION_DROPetkinliğini de alsa bile sürükleme etkinliklerini almak üzere kaydedilmiş her dinleyiciye gönderilir.
Bu adımların her biri Sürükle ve bırak işlemi başlıklı bölümde daha ayrıntılı olarak açıklanmıştır.
Etkinlikleri sürükleme
Sistem, sürükle ve bırak işleminde neler olduğunu açıklayan bir işlem türü içeren DragEvent nesnesi biçiminde bir sürükle etkinliği gönderir. İşlem türüne bağlı olarak nesne başka veriler de içerebilir.
Sürükleme etkinliği işleyicileri DragEvent nesnesini alır. Dinleyiciler, işlem türünü almak için DragEvent.getAction() numaralı telefonu arar.
DragEvent sınıfında sabitlerle tanımlanan altı olası değer vardır. Bu değerler tablo 1'de açıklanmıştır:
Tablo 1. DragEvent işlem türleri
| İşlem türü | Anlamı | 
|---|---|
| ACTION_DRAG_STARTED | Uygulama, startDragAndDrop()işlevini çağırır ve sürükleme gölgesi elde eder. Dinleyici, bu işlem için sürükleme etkinliklerini almaya devam etmek istiyorsa sistemetrueboole değerini döndürmelidir. | 
| 
          
            ACTION_DRAG_ENTERED | Sürükleme gölgesi, sürükleme etkinliği işleyicisinin Viewsınır kutusuna girer. Bu, sürükleme gölgesi sınır kutusuna girdiğinde işleyicinin aldığı ilk etkinlik işlem türüdür. | 
| 
          
            ACTION_DRAG_LOCATION | Bir ACTION_DRAG_ENTEREDetkinliğinden sonra, sürükleme gölgesi hâlâ sürükleme etkinliği işleyicisininViewsınır kutusu içindedir. | 
| 
          
            ACTION_DRAG_EXITED | Bir ACTION_DRAG_ENTEREDve en az birACTION_DRAG_LOCATIONetkinliğinin ardından, sürükleme gölgesi, sürükleme etkinliği işleyicisininViewöğesinin sınır kutusu dışına taşınır. | 
| 
          
            ACTION_DROP | Sürükleme gölgesi, sürükleme etkinliği işleyicisinin Viewüzerinde bırakılır. Bu işlem türü, yalnızca işleyiciACTION_DRAG_STARTEDsürükleme etkinliğine yanıt olarak doğru veya yanlış değerini döndürüyorsaViewnesnesinin işleyicisine gönderilir.trueKullanıcı, sürükle gölgesini dinleyicisi kayıtlı olmayan birViewüzerinde bırakırsa veya sürükle gölgesini mevcut düzenin parçası olmayan bir öğe üzerinde bırakırsa bu işlem türü gönderilmez.
            Dinleyici, düşüşü başarıyla işlerse boole  | 
| 
          
            ACTION_DRAG_ENDED | Sistem, sürükle ve bırak işlemini sonlandırıyor. Bu işlem türünün öncesinde mutlaka bir ACTION_DROPetkinliği bulunmaz. Sistem birACTION_DROPgönderirseACTION_DRAG_ENDEDişlem türünü almak, bırakma işleminin başarılı olduğu anlamına gelmez. Dinleyici,ACTION_DROP'e yanıt olarak döndürülen değeri almak için tablo 2'de gösterildiği gibigetResult()işlevini çağırmalıdır. BirACTION_DROPetkinliği gönderilmezsegetResult(),falsedeğerini döndürür. | 
DragEvent nesnesi, uygulamanızın startDragAndDrop() çağrısında sisteme sağladığı verileri ve meta verileri de içerir. Verilerin bir kısmı, tablo 2'de özetlendiği gibi yalnızca belirli işlem türleri için geçerlidir. Etkinlikler ve bunlarla ilişkili veriler hakkında daha fazla bilgi için Sürükle ve bırak işlemi başlıklı bölüme bakın.
Tablo 2. İşlem türüne göre geçerli DragEvent verileri
| getAction()value | getClipDescription()value | getLocalState()value | getX()value | getY()value | getClipData()value | getResult()value | 
|---|---|---|---|---|---|---|
| ACTION_DRAG_STARTED | ✓ | ✓ | ||||
| ACTION_DRAG_ENTERED | ✓ | ✓ | ||||
| ACTION_DRAG_LOCATION | ✓ | ✓ | ✓ | ✓ | ||
| ACTION_DRAG_EXITED | ✓ | ✓ | ||||
| ACTION_DROP | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ACTION_DRAG_ENDED | ✓ | ✓ | 
DragEvent yöntemleri getAction(),
describeContents(),
writeToParcel() ve toString() her zaman geçerli veriler döndürür.
Bir yöntem belirli bir işlem türü için geçerli veriler içermiyorsa sonuç türüne bağlı olarak null veya 0 döndürür.
Gölgeyi sürükleme
Sürükle ve bırak işlemi sırasında sistem, kullanıcının sürüklediği bir resim gösterir. Veri taşıma işleminde bu resim, sürüklenen verileri temsil eder. Diğer işlemlerde resim, sürükleme işleminin bazı yönlerini temsil eder.
Bu resme sürükle gölgesi denir. Bir View.DragShadowBuilder nesnesi için tanımladığınız yöntemlerle oluşturursunuz. startDragAndDrop() kullanarak sürükle ve bırak işlemi başlattığınızda oluşturucuyu sisteme iletirsiniz. Sistem, startDragAndDrop() isteğine yanıt olarak sürükleme gölgesi elde etmek için View.DragShadowBuilder içinde tanımladığınız geri çağırma yöntemlerini çağırır.
View.DragShadowBuilder sınıfının iki kurucusu vardır:
- View.DragShadowBuilder(View)
- Bu kurucu, uygulamanızın - Viewnesnelerinin tümünü kabul eder. Oluşturucu,- Viewnesnesini- View.DragShadowBuildernesnesinde depolar. Böylece geri çağırma işlevleri, sürükleme gölgesini oluşturmak için bu nesneye erişebilir. Görünüm, kullanıcının sürükleme işlemini başlatmak için seçtiği bir- Viewolmak zorunda değildir.- Bu kurucuyu kullanırsanız - View.DragShadowBuildersınıfını genişletmeniz veya yöntemlerini geçersiz kılmanız gerekmez. Varsayılan olarak, kullanıcının ekrana dokunduğu konumun altında, bağımsız değişken olarak ilettiğiniz- Viewile aynı görünüme sahip bir sürükle gölge alırsınız.
- View.DragShadowBuilder()
- Bu kurucuyu kullanırsanız - View.DragShadowBuildernesnesinde- Viewnesnesi kullanılamaz. Alan- nullolarak ayarlanmıştır.- View.DragShadowBuildersınıfını genişletip yöntemlerini geçersiz kılmanız gerekir. Aksi takdirde görünmez bir sürükleme gölgesi alırsınız. Sistem hata vermez.
View.DragShadowBuilder sınıfında, birlikte sürükleme gölgesini oluşturan iki yöntem vardır:
- onProvideShadowMetrics()
- Sistem, - startDragAndDrop()'ü aradıktan hemen sonra bu yöntemi çağırır. Sürükle gölgesinin boyutlarını ve dokunma noktasını sisteme göndermek için yöntemi kullanın. Yöntemin iki parametresi vardır:- outShadowSize:- Pointsınıfından bir nesne. Sürükleme gölgesinin genişliği- x, yüksekliği ise- yalanına girilir.- outShadowTouchPoint:- Pointnesnesi. Dokunma noktası, sürükleme gölgesi içinde sürükleme sırasında kullanıcının parmağının altında olması gereken konumdur. X konumu- x, Y konumu ise- yalanına girer.
- onDrawShadow()
- Sistem, - onProvideShadowMetrics()çağrısından hemen sonra sürükleme gölgesini oluşturmak için- onDrawShadow()çağrısı yapar. Yöntemin tek bir bağımsız değişkeni vardır. Bu bağımsız değişken, sistemin- onProvideShadowMetrics()içinde sağladığınız parametrelerden oluşturduğu bir- Canvasnesnesidir. Yöntem, sağlanan- Canvasüzerinde sürükleme gölgesini çizer.
Performansı iyileştirmek için sürükleme gölgesinin boyutunu küçük tutun. Tek bir öğe için simge kullanabilirsiniz. Birden fazla öğe içeren bir seçim için ekranda yayılmış tam resimler yerine gruplandırılmış simgeler kullanmak isteyebilirsiniz.
Etkinlik işleyicileri ve geri çağırma yöntemlerini sürükleme
View, View.OnDragListener uygulayan bir sürükle etkinlik işleyiciyle veya görünümün onDragEvent() geri arama yöntemiyle sürükle etkinliklerini alır. Sistem yöntemi veya dinleyiciyi çağrdığında bir DragEvent bağımsız değişkeni sağlar.
Çoğu durumda, geri çağırma yöntemi yerine dinleyici kullanılması tercih edilir. Kullanıcı arayüzleri tasarlarken genellikle View sınıflarını alt sınıflandırmazsınız ancak geri çağırma yöntemini kullanmak, yöntemi geçersiz kılmak için alt sınıflar oluşturmanızı zorunlu kılar. Buna karşılık, tek bir dinleyici sınıfı uygulayıp bunu birden fazla farklı View nesnesi ile kullanabilirsiniz. Anonim satır içi sınıf veya lambda ifadesi olarak da uygulayabilirsiniz. Bir View nesnesi için dinleyiciyi ayarlamak üzere setOnDragListener() işlevini çağırın.
Alternatif olarak, yöntemi geçersiz kılmadan onDragEvent()
varsayılan uygulamasını değiştirebilirsiniz. Bir görünüme OnReceiveContentListener ayarlayın. Daha fazla bilgi için setOnReceiveContentListener() bölümüne bakın.
onDragEvent() yöntemi daha sonra varsayılan olarak aşağıdakileri yapar:
- startDragAndDrop()çağrısına yanıt olarak doğru değerini döndürür.
- Veriler sürükleyip görünüme bırakılırsa - performReceiveContent()araması yapılır. Veriler, yönteme- ContentInfonesnesi olarak iletilir. Yöntem,- OnReceiveContentListeneröğesini çağırır.
- Sürükle ve bırak verileri görünüme bırakılırsa ve - OnReceiveContentListeneriçerikten herhangi birini tüketirse true değerini döndürür.
Verileri uygulamanız için özel olarak işlemek üzere OnReceiveContentListener parametresini tanımlayın. API seviyesi 24'e kadar geriye dönük uyumluluk için OnReceiveContentListener parametresinin Jetpack sürümünü kullanın.
Bir View nesnesi için sürükleme etkinliği işleyiciniz ve geri arama yönteminiz olabilir. Bu durumda sistem önce işleyiciyi çağırır. Dinleyici false döndürmediği sürece sistem geri çağırma yöntemini çağırmaz.
onDragEvent() yöntemi ile View.OnDragListener'un kombinasyonu, dokunma etkinlikleriyle kullanılan onTouchEvent() ve View.OnTouchListener kombinasyonuna benzer.
 
  