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çinACTION_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 sisteme true boole değerini döndürmelidir.
|
ACTION_DRAG_ENTERED |
Sürükleme gölgesi, sürükleme etkinliği işleyicisinin View sı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_ENTERED etkinliğinden sonra, sürükleme gölgesi hâlâ sürükleme etkinliği işleyicisinin View sınır kutusu içindedir.
|
ACTION_DRAG_EXITED |
Bir ACTION_DRAG_ENTERED ve en az bir ACTION_DRAG_LOCATION etkinliğinin ardından, sürükleme gölgesi, sürükleme etkinliği işleyicisinin View öğ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şleyici ACTION_DRAG_STARTED sürükleme etkinliğine yanıt olarak doğru veya yanlış değerini döndürüyorsa View nesnesinin işleyicisine gönderilir.true Kullanıcı, sürükle gölgesini dinleyicisi kayıtlı olmayan bir View ü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_DROP etkinliği bulunmaz. Sistem bir ACTION_DROP gönderirse ACTION_DRAG_ENDED iş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 gibi getResult() işlevini çağırmalıdır. Bir ACTION_DROP etkinliği gönderilmezse getResult(), false değ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,ViewnesnesiniView.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 birViewolmak 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ğinizViewile aynı görünüme sahip bir sürükle gölge alırsınız.View.DragShadowBuilder()Bu kurucuyu kullanırsanız
View.DragShadowBuildernesnesindeViewnesnesi kullanılamaz. Alannullolarak 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ğix, yüksekliği iseyalanı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 konumux, Y konumu iseyalanına girer.onDrawShadow()Sistem,
onProvideShadowMetrics()çağrısından hemen sonra sürükleme gölgesini oluşturmak içinonDrawShadow()çağrısı yapar. Yöntemin tek bir bağımsız değişkeni vardır. Bu bağımsız değişken, sisteminonProvideShadowMetrics()içinde sağladığınız parametrelerden oluşturduğu birCanvasnesnesidir. Yöntem, sağlananCanvasü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öntemeContentInfonesnesi 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.