Aşağıdaki bölümlerde, sürükle ve bırakma işlemiyle ilgili birkaç temel kavram açıklanmaktadır.
Sürükleme ve bırakma işlemi
Sürükle ve bırakma sürecinde dört adım veya durum vardır: başlatıldı, devam ediyor, bırakıldı ve sona erdi.
- Başladı
Uygulamanız, kullanıcının sürükleme hareketine yanıt olarak
startDragAndDrop()işlevini çağırarak sisteme sürükle ve bırak işlemini başlatmasını söyler. Yöntemin bağımsız değişkenleri şunları sağlar:- Sürüklenecek veriler.
- Sürükleme gölgesini çizmek için geri çağırma
- Sürüklenen verileri açıklayan meta veriler
- Sistem, sürükleme gölgesi almak için uygulamanızı geri arayarak yanıt verir. Sistem, sürükleme gölgesini cihazda gösterir.
- Ardından sistem, mevcut düzendeki tüm
Viewnesnelerinin sürükleme etkinliği dinleyicisineACTION_DRAG_STARTEDişlem türüyle bir sürükleme 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şleyicisinintruedeğerini döndürmesi gerekir. Bu, dinleyiciyi sisteme kaydeder. Yalnızca kayıtlı dinleyiciler sürükleme etkinlikleri almaya devam eder. Bu noktada dinleyiciler, görünümün bırakma etkinliğini kabul edebileceğini göstermek için bırakma hedefiViewnesnesinin görünümünü de değiştirebilir. - Sürükleme etkinliği işleyicisi
falsedeğerini döndürürse sistem,ACTION_DRAG_ENDEDişlem türüyle bir sürükleme etkinliği gönderene kadar mevcut işlem için sürükleme etkinlikleri almaz. Dinleyicifalsedeğerini döndürerek sisteme sürükle ve bırak işlemiyle ilgilenmediğini ve sürüklenen verileri kabul etmek istemediğini bildirir.
- Devam ediliyor
- Kullanıcı sürüklemeye devam ederse Sürükleme gölgesi, bırakma hedefinin sınırlayıcı 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ırlayıcı kutusuna girdiğini belirtiyorsa (işlem türüACTION_DRAG_ENTERED), dinleyiciViewöğesini vurgulayarak tepki verebilir. - Atıldı
- Kullanıcı, sürükleme gölgesini bir bırakma hedefinin sınırlayıcı kutusu içinde bırakır. Sistem, bırakma hedefinin işleyicisine
ACTION_DROPişlem türüne sahip bir sürükleme etkinliği gönderir. Sürükleme etkinliği nesnesi, işlemi başlatanstartDragAndDrop()çağrısında sisteme iletilen verileri içerir. Dinleyicinin, bırakılan verileri başarıyla işlemesi durumunda sisteme Boole değeritruedöndürmesi beklenir. : Bu adım yalnızca kullanıcı, dinleyicisi sürükleme etkinliklerini alacak şekilde kaydedilmiş birViewöğesinin sınırlayıcı kutusu içinde sürükleme gölgesini bıraktığında gerçekleşir (bırakma hedefi). Kullanıcı, sürükleme gölgesini başka bir durumda serbest bırakırsaACTION_DROPsürükleme etkinliği gönderilmez. - Sona erdi
Kullanıcı sürükleme gölgesini bıraktıktan ve sistem
gerekirse
ACTION_DROPişlem türüyle bir sürükleme etkinliği gönderir. Sistem, sürükle ve bırak işleminin sona erdiğini belirtmek içinACTION_DRAG_ENDEDişlem türüyle bir sürükleme etkinliği gönderir. Bu işlem, kullanıcı sürükleme gölgesini nerede bıraktığına bakılmaksızın yapılır. Etkinlik, dinleyiciACTION_DROPetkinliğini de alsa bile sürükleme etkinliklerini alacak şekilde kayıtlı olan 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.
Sürükleme etkinlikleri
Sistem, sürükle ve bırak işleminde ne olduğunu açıklayan bir işlem türü içeren DragEvent nesnesi biçiminde bir sürükleme 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. İşlem türünü almak için dinleyiciler DragEvent.getAction() işlevini çağırır.
DragEvent sınıfındaki 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 etkinlikleri almaya devam etmek istiyorsa sisteme boolean true değerini döndürmelidir.
|
ACTION_DRAG_ENTERED |
Sürükleme gölgesi, sürükleme etkinliği işleyicisinin sınırlayıcı kutusuna girer
View. Bu, dinleyicinin sürükleme gölgesi sınırlayıcı kutuya girdiğinde aldığı ilk etkinlik işlemi türüdür.
|
ACTION_DRAG_LOCATION |
Bir ACTION_DRAG_ENTERED etkinliğinden sonra sürükleme gölgesi, sürükleme etkinliği işleyicisinin View sınırlayıcı kutusunun içinde kalır.
|
ACTION_DRAG_EXITED |
Bir ACTION_DRAG_ENTERED ve en az bir ACTION_DRAG_LOCATION etkinliğinden sonra sürükleme gölgesi, sürükleme etkinliği işleyicisinin View sınırlayıcı kutusunun dışına çıkar.
|
ACTION_DROP |
Sürükleme gölgesi, sürükleme etkinliği işleyicisinin View üzerinde serbest bırakılır. Bu işlem türü, yalnızca dinleyici ACTION_DRAG_STARTED sürükleme etkinliğine yanıt olarak boolean true döndürürse bir View nesnesinin dinleyicisine gönderilir. Kullanıcı, dinleyicisi kayıtlı olmayan bir View üzerinde sürükleme gölgesini serbest bırakırsa veya sürükleme gölgesini mevcut düzenin parçası olmayan bir şey üzerinde serbest bırakırsa bu işlem türü gönderilmez.
Dinleyici, bırakma işlemini başarıyla işlerse boole |
ACTION_DRAG_ENDED |
Sistem, sürükle ve bırakma işlemini sonlandırıyor. Bu işlem türünden
önce mutlaka bir ACTION_DROP etkinliği gerçekleşmez. Sistem bir ACTION_DROP gönderirse ACTION_DRAG_ENDED işlem türünün alınması, bırakma işleminin başarılı olduğu anlamına gelmez. Dinleyici, getResult() değerini almak için tablo 2'de gösterildiği gibi getResult() değerini çağırmalıdır. Bu değer, ACTION_DROP yanıtında döndürülü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ı yalnızca Tablo 2'de özetlenen 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.
Sürükleme gölgesi
Sürükle ve bırak işlemi sırasında sistem, kullanıcının sürüklediği bir resmi gösterir. Veri taşıma işleminde bu resim, sürüklenen verileri gösterir. Diğer işlemler için resim, sürükleme işleminin bir yönünü gösterir.
Bu resme sürükleme gölgesi denir. View.DragShadowBuilder
nesnesi için bildirdiğiniz yöntemlerle oluşturursunuz. startDragAndDrop() kullanarak bir sürükle ve bırak işlemi başlattığınızda oluşturucuyu sisteme iletirsiniz. Sistem, startDragAndDrop() yanıtının bir parçası 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 oluşturucusu vardır:
View.DragShadowBuilder(View)Bu oluşturucu, uygulamanızın
Viewnesnelerini 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 birViewolmamalıdır.Bu oluşturucuyu kullanırsanız
View.DragShadowBuilderöğesini genişletmeniz veya yöntemlerini geçersiz kılmanız gerekmez. Varsayılan olarak, bağımsız değişken olarak ilettiğinizViewile aynı görünüme sahip, kullanıcının ekrana dokunduğu konumun altında ortalanmış bir sürükleme gölgesi elde edersiniz.View.DragShadowBuilder()Bu oluşturucuyu kullanırsanız
ViewnesnesindeView.DragShadowBuildernesnesi bulunmaz. Alannullolarak ayarlanır.View.DragShadowBuilderöğesini genişletip yöntemlerini geçersiz kılmanız gerekir. Aksi takdirde görünmez bir sürükleme gölgesi elde edersiniz. Sistem hata vermez.
View.DragShadowBuilder sınıfı, birlikte sürükleme gölgesini oluşturan iki yönteme sahiptir:
onProvideShadowMetrics()Siz
startDragAndDrop()'ı aradıktan hemen sonra sistem bu yöntemi çağırır. Sürükleme gölgesinin boyutlarını ve dokunma noktasını sisteme göndermek için bu yöntemi kullanın. Yöntemin iki parametresi vardır:outShadowSize:Pointnesnesi. Sürükleme gölgesinin genişliğix, yüksekliği iseyiçine girer.outShadowTouchPoint:Pointnesnesi. Dokunma noktası, sürükleme sırasında kullanıcının parmağının altında olması gereken, sürükleme gölgesinin içindeki konumdur. X konumux'ye, Y konumu isey'e girilir.onDrawShadow()onProvideShadowMetrics()çağrısından hemen sonra sistem, sürükleme gölgesini oluşturmak içinonDrawShadow()çağrısını yapar. Yöntemin tek bir bağımsız değişkeni vardır:Canvasnesnesi. Bu nesne, sistem tarafındanonProvideShadowMetrics()içinde sağladığınız parametrelerden oluşturulur. Yöntem, sağlananCanvasüzerinde sürükleme gölgesini çizer.
Performansı artırmak için sürükleme gölgesinin boyutunu küçük tutun. Tek bir öğe için simge kullanmak isteyebilirsiniz. Birden fazla öğe seçimi için, ekrana yayılmış tam resimler yerine üst üste yerleştirilmiş simgeler kullanmak isteyebilirsiniz.
Sürükleme etkinliği işleyicileri ve geri çağırma yöntemleri
Bir View, View.OnDragListener uygulayan bir sürükleme etkinliği işleyicisiyle veya görünümün onDragEvent() geri arama yöntemiyle sürükleme etkinlikleri alır. Sistem, yöntemi veya işleyiciyi çağırdığında DragEvent bağımsız değişkenini sağlar.
Çoğu durumda, geri çağırma yöntemi yerine dinleyici kullanmak tercih edilir. Kullanıcı arayüzleri tasarlarken genellikle View sınıflarını alt sınıflara ayı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ı uygulayabilir ve bunu birden fazla farklı View nesneyle kullanabilirsiniz. Ayrıca, 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ümde
OnReceiveContentListener
ayarlayın. Daha fazla bilgi için
setOnReceiveContentListener() başlıklı makaleye bakın.
onDragEvent() yöntemi varsayılan olarak şunları yapar:
startDragAndDrop()numaralı telefona yapılan arama yanıtında doğru değerini döndürür.Aramalar
performReceiveContent()Sürükleyip bırakılan veriler görünüme bırakılırsa. Veriler,ContentInfonesnesi olarak yönteme 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çeriğin herhangi bir bölümünü kullanırsa true değerini döndürür.
Verileri uygulamanıza özel olarak işlemek için OnReceiveContentListener tanımlayın. API seviyesi 24'e kadar geriye dönük uyumluluk için OnReceiveContentListener'ın Jetpack sürümünü kullanın.
Bir View nesnesi için sürükleme etkinliği işleyicisi ve geri çağırma yöntemi 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 kombinasyonu, dokunma etkinlikleriyle kullanılan onTouchEvent() ve View.OnTouchListener kombinasyonuna benzer.