Temel kavramlar

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şleyicisine ACTION_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şleyicisi true 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 hedefi View 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 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 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şlatan startDragAndDrop() çağrısında sisteme iletilen verileri içerir. İşleyici, bırakılan verileri başarılı bir şekilde işlerse dinleyicinin sisteme true 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ı bir View öğ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ırsa ACTION_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çin ACTION_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şleyici ACTION_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:

Tablo 1. DragEvent işlem türleri

İş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 true boole değerini döndürür. Aksi takdirde false değerini döndürmesi gerekir.

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.

Tablo 2. İşlem türüne göre geçerli DragEvent verileri

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 nesnesini View.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 bir View 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ğiniz View 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 nesnesinde View nesnesi bulunmaz. Alan null 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: bir Point nesnesi. Sürükleme gölgesi genişliği x, yüksekliği ise y içinde yer alır.

outShadowTouchPoint: Bir Point 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 konumu x, Y konumu ise y oldu.

onDrawShadow()

onProvideShadowMetrics() çağrısından hemen sonra sistem, sürükleme gölgesini oluşturmak için onDrawShadow() yöntemini çağırır. Yöntem, sistemin onProvideShadowMetrics() içinde sağladığınız parametrelerden oluşturduğu bir Canvas nesnesi olan tek bir bağımsız değişkene sahiptir. Yöntem, sürükleme gölgesini sağlanan Canvas ü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 bir ContentInfo nesnesi olarak aktarılır. Yöntem OnReceiveContentListener 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.