Temel kavramlar

Oluşturma yöntemini deneyin
Android için önerilen kullanıcı arayüzü araç seti Jetpack Compose'dur. Oluştur'da sürükle ve bırak özelliğini nasıl kullanacağınızı öğrenin.

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 dinleyicisine ACTION_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şleyicisinin true 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 hedefi View 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şlatan startDragAndDrop() çağrısında sisteme iletilen verileri içerir. Dinleyici, bırakılan verileri başarıyla işlerse sisteme true 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ı bir View'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ırsa ACTION_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çin ACTION_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 true değerini döndürür. Aksi takdirde false döndürmelidir.

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 nesnesini View.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 bir View 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ğiniz View 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 nesnesinde View nesnesi kullanılamaz. Alan null 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ği x, yüksekliği ise y 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 konumu x, Y konumu ise y alanına girer.

onDrawShadow()

Sistem, onProvideShadowMetrics() çağrısından hemen sonra sürükleme gölgesini oluşturmak için onDrawShadow() çağrısı yapar. Yöntemin tek bir bağımsız değişkeni vardır. Bu bağımsız değişken, sistemin onProvideShadowMetrics() içinde sağladığınız parametrelerden oluşturduğu bir Canvas nesnesidir. Yöntem, sağlanan Canvas ü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önteme ContentInfo 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.