Aşağıdaki bölümlerde, sürükleyip bırakma işlemiyle ilgili birkaç temel kavram açıklanmaktadır.
Sürükleme ve bırakma işlemi
Sürükle ve bırak işleminde dört adım veya durum vardır: başlatıldı, devam ediyor, bırakıldı ve sonlandırıldı.
- Başlatıldı
Kullanıcının sürükleme hareketine yanıt olarak, uygulamanız sisteme bir sürükle ve bırak işlemi başlatmasını bildirmek için
startDragAndDrop()
yöntemini çağırır. Yöntemin bağımsız değişkenleri aşağıdakileri sağlar:- Sürüklenecek veri.
- Sürükleme gölgesini çizmek için bir geri çağırma
- Sürüklenen verileri açıklayan meta veriler
- Sistem, sürükleme gölgesi almak için uygulamanızı geri çağırarak yanıt verir. Ardından sistem, cihazda sürükleme gölgesini görüntüler.
- Ardından, sistem geçerli düzendeki tüm
View
nesnelerinin sürükleme etkinliği işleyicisineACTION_DRAG_STARTED
işlem türüyle bir sürükleme etkinliği gönderir. Olası bir bırakma etkinliği dahil sürükleme etkinliklerini almaya devam etmek için sürükleme etkinliği işleyicisitrue
değerini döndürmelidir. Bu işlem, dinleyiciyi sisteme kaydeder. Yalnızca kayıtlı işleyiciler sürükleme etkinliklerini almaya devam eder. Bu noktada, dinleyiciler bırakma hedefiView
nesnelerinin görünümünü de değiştirerek görünümün, bir bırakma etkinliğini kabul edebileceğini gösterebilir. - Sürükleme etkinliği işleyici
false
değerini döndürürse sistemACTION_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 etkinliklerini almaz. İşleyici,false
değ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 ediyor
- Sürüklemeye kullanıcı devam eder. Sürükleme gölgesi, bir bırakma hedefinin sınırlayıcı kutusuyla kesişirken 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
View
düşme hedefinin görünümünü değiştirebilir. Örneğin, etkinlik, sürükleme gölgesinin bırakma hedefinin sınırlayıcı kutusuna (işlem türüACTION_DRAG_ENTERED
) girdiğini belirtiyorsa işleyici,View
işaretini vurgulayarak tepki verebilir. - Atıldı
- Kullanıcı, bir bırakma hedefinin sınır kutusu içinde sürükleme gölgesini serbest bırakır. Sistem, bırakma hedefinin işleyicisine
ACTION_DROP
iş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. İşleyici, bırakılan verileri başarılı bir şekilde işlerse dinleyicinin sistemetrue
boole'sini döndürmesi beklenir. : Bu adım yalnızca kullanıcı, işleyicisi sürükleme etkinliklerini (bırakma hedefi) almak üzere kayıtlı birView
öğesinin sınırlayıcı kutusu içine sürükleme gölgesini bırakırsa gerçekleşir. Kullanıcı başka bir durumda sürükleme gölgesini serbest bırakırsaACTION_DROP
sürükleme etkinliği gönderilmez. - Sona erdi
Kullanıcı sürükleme gölgesini serbest bıraktıktan ve sistem gönderdikten sonra
ACTION_DROP
işlem türüne sahip bir sürükleme etkinliği başlatırsanız sistem, sürükleme ve bırakma işleminin sona erdiğini belirtmek içinACTION_DRAG_ENDED
işlem türüne sahip bir sürükleme etkinliği gönderir. Bu işlem, kullanıcının sürükleme gölgesini nerede bıraktığından bağımsız olarak gerçekleştirilir. Etkinlik, işleyiciACTION_DROP
etkinliğini alsa bile sürükleme etkinliklerini almak için kayıtlı her işleyiciye gönderilir.
Bu adımların her biri, Sürükle ve bırak işlemi adlı bölümde daha ayrıntılı bir şekilde açıklanmıştır.
Sürükleme etkinlikleri
Sistem, DragEvent
nesnesi biçiminde bir sürükleme etkinliği gönderir. Bu nesne, sürükle ve bırak işleminde neler olduğunu açıklayan bir işlem türünü içerir. İş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ü öğrenmek için dinleyiciler DragEvent.getAction()
çağrısı yapar.
DragEvent
sınıfında sabit değerlerle tanımlanan ve tablo 1'de açıklanan altı olası değer vardır:
İşlem türü | Anlamı |
---|---|
ACTION_DRAG_STARTED |
Uygulama startDragAndDrop() işlevini çağırır ve bir sürükleme gölgesi elde eder. İşleyici bu işlem için sürükleme etkinliklerini almaya devam etmek isterse 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ırlayıcı kutusuna girer. Bu, sürükleme gölgesi sınırlayıcı kutuya girdiğinde işleyicinin aldığı ilk etkinlik işlemi 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ırlayıcı 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 sınırlayıcı kutusunun dışına hareket eder.
|
ACTION_DROP |
Sürükleme gölgesi, sürükleme etkinliği işleyicisinin View öğesi ü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 true Boole değerini döndürürse bir View nesnesinin işleyicisine gönderilir. Kullanıcı sürükleme gölgesini, işleyicisi kayıtlı olmayan bir View öğesinin üzerine getirirse veya kullanıcı geçerli düzenin parçası olmayan bir öğenin üzerine sürükleme gölgesini bırakırsa bu işlem türü gönderilmez.
İşleyici, düşüşü başarıyla işlerse |
ACTION_DRAG_ENDED |
Sistem, sürükle ve bırak işlemini sona erdiriyor. Bu işlem türünün öncesinde bir ACTION_DROP etkinliği olması şart değildir. Sistem bir ACTION_DROP gönderirse ACTION_DRAG_ENDED işlem türünü almak düşüşün başarılı olduğu anlamına gelmez. İşleyici, ACTION_DROP yanıtı olarak döndürülen değeri almak için tablo 2'de gösterildiği gibi getResult() yöntemini ç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. Bazı veriler, yalnızca Tablo 2'de özetlendiği üzere belirli işlem türleri için geçerlidir. Etkinlikler ve ilişkili verileri hakkında daha fazla bilgi için Sürükleme ve bırakma işlemi adlı bölüme bakın.
getAction() değer |
getClipDescription() değer |
getLocalState() değer |
getX() değer |
getY() değer |
getClipData() değer |
getResult() değer |
---|---|---|---|---|---|---|
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.
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 değerini 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örüntüler. Bu resim, veri taşıma için sürüklenmekte olan verileri temsil etmektedir. Diğer işlemlerde resim, sürükleme işleminin bir yönünü temsil eder.
Bu görüntü, sürükleme gölgesi olarak adlandırılır. Bunu, 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()
özelliğine verdiği yanıtı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 kurucusu vardır:
View.DragShadowBuilder(View)
Bu oluşturucu, uygulamanızın
View
nesnelerinden herhangi birini kabul eder. Oluşturucu,View
nesnesiniView.DragShadowBuilder
nesnesinde depolar. Böylece geri çağırmalar, sürükleme gölgesini oluşturmak için nesneye erişebilir. Görünümün, kullanıcının sürükleme işlemini başlatmak için seçtiği birView
olması gerekmez.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ğinizView
ile 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
View.DragShadowBuilder
nesnesindeView
nesnesi bulunmaz. Alannull
olarak ayarlandı.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 bildirmez.
View.DragShadowBuilder
sınıfı, birlikte sürükleme gölgesini oluşturan iki yönteme sahiptir:
onProvideShadowMetrics()
Sistem bu yöntemi,
startDragAndDrop()
çağrısından hemen sonra çağırır. Sürükleme gölgesinin boyutlarını ve temas noktasını sisteme göndermek için bu yöntemi kullanın. Yöntemin iki parametresi vardır:outShadowSize
: birPoint
nesnesi. Sürükleme gölgesi genişliğix
, yüksekliği isey
içinde yer alır.outShadowTouchPoint
: BirPoint
nesnesi. Temas 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
, Y konumu isey
oldu.onDrawShadow()
onProvideShadowMetrics()
çağrısından hemen sonra sistem, sürükleme gölgesini oluşturmak içinonDrawShadow()
yöntemini çağırır. Yöntem, sisteminonProvideShadowMetrics()
içinde sağladığınız parametrelerden oluşturduğu birCanvas
nesnesi olan tek bir bağımsız değişkene sahiptir. Yöntem, sürükleme gölgesini sağlananCanvas
üzerine çizer.
Performansı artırmak için sürükleme gölgesinin boyutunu küçük tutun. Tek bir öğe için bir simge kullanmak isteyebilirsiniz. Birden fazla öğe seçimi için ekrana yayılmış tam resimler yerine simgeleri bir yığın halinde kullanmak isteyebilirsiniz.
Etkinlik işleyicilerini ve geri çağırma yöntemlerini sürükleme
View
, sürükleme etkinliklerini, View.OnDragListener
uygulayan bir sürükleme etkinliği işleyicisi veya görünümün onDragEvent()
geri çağırma yöntemiyle alır. Sistem, yöntemi veya işleyiciyi çağırdığında bir DragEvent
bağımsız değişkeni sağlar.
Çoğu durumda, geri çağırma yönteminin yerine bir işleyici kullanılması tercih edilir. Kullanıcı arayüzleri tasarlarken genellikle View
sınıfını alt sınıflandırmazsınız. Ancak geri çağırma yöntemini kullandığınızda, yöntemi geçersiz kılmak için alt sınıflar oluşturmaya zorlanırsınız. Buna karşılık, bir işleyici sınıfı uygulayıp ardından bu sınıfı birden fazla farklı View
nesnesiyle kullanabilirsiniz. Bunu anonim bir satır içi sınıf veya lambda ifadesi olarak da uygulayabilirsiniz. Bir View
nesnesinin işleyicisini ayarlamak için setOnDragListener()
çağrısı yapın.
Alternatif olarak, yöntemi geçersiz kılmadan varsayılan onDragEvent()
uygulamasını değiştirebilirsiniz. Bir görünümde OnReceiveContentListener
ayarlama. Ayrıntılı bilgi için setOnReceiveContentListener()
bölümünü inceleyin.
Daha sonra onDragEvent()
yöntemi varsayılan olarak aşağıdakileri yapar:
startDragAndDrop()
çağrısına yanıt olarak true döndürür.Sürükle ve bırak verileri görünüme bırakıldıysa
performReceiveContent()
çağrıları. Veriler, yönteme birContentInfo
nesnesi olarak aktarılır. YöntemOnReceiveContentListener
yöntemini çağırır.Sürükle ve bırak verileri görünüme bırakılır ve
OnReceiveContentListener
herhangi bir içeriği tüketirse true değerini döndürür.
Verileri özellikle uygulamanız için işlemek üzere OnReceiveContentListener
tanımlayın. API düzeyi 24'e kadar geriye dönük uyumluluk için OnReceiveContentListener
Jetpack sürümünü kullanın.
View
nesnesi için bir sürükleme etkinliği işleyiciniz ve bir geri çağırma yönteminiz olabilir. Bu durumda, sistem ilk olarak işleyiciyi çağırır. İşleyici false
değerini 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
kombinasyonlarının kombinasyonuna benzer.