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
View
nesnelerinin sürükle etkinliği dinleyicisineACTION_DRAG_STARTED
iş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şleyicisinintrue
dö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 hedefiView
nesnelerinin görünümünü de değiştirebilir. - Sürükleme etkinliği dinleyicisi
false
döndürürse sistem,ACTION_DRAG_ENDED
iş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,false
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 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
View
gö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_DROP
iş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 sistemetrue
boole 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_DROP
sürükleme etkinliği gönderilmez. - Sona erdi
Kullanıcı sürükleme gölgesini bıraktıktan ve sistem
ACTION_DROP
iş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_ENDED
iş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_DROP
etkinliğ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
View
nesnelerinin tümünü kabul eder. Oluşturucu,View
nesnesiniView.DragShadowBuilder
nesnesinde 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 birView
olmak zorunda değildir.Bu kurucuyu kullanırsanız
View.DragShadowBuilder
sı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ğinizView
ile aynı görünüme sahip bir sürükle gölge alırsınız.View.DragShadowBuilder()
Bu kurucuyu kullanırsanız
View.DragShadowBuilder
nesnesindeView
nesnesi kullanılamaz. Alannull
olarak ayarlanmıştır.View.DragShadowBuilder
sı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
:Point
sınıfından bir nesne. Sürükleme gölgesinin genişliğix
, yüksekliği isey
alanına girilir.outShadowTouchPoint
:Point
nesnesi. 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 isey
alanı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 birCanvas
nesnesidir. 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öntemeContentInfo
nesnesi 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
OnReceiveContentListener
iç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.