Temel kavramlar

Compose yöntemini deneyin
Jetpack Compose, Android için önerilen kullanıcı arayüzü araç setidir. Compose'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ı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 View nesnelerinin sürükleme etkinliği dinleyicisine ACTION_DRAG_STARTED iş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şleyicisinin true değ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 hedefi View nesnesinin görünümünü de değiştirebilir.
  • Sürükleme etkinliği işleyicisi false değerini döndürürse sistem, ACTION_DRAG_ENDED işlem türüyle bir sürükleme etkinliği gönderene kadar mevcut işlem için sürükleme etkinlikleri almaz. Dinleyici 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 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 View gö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), dinleyici View öğ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_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. Dinleyicinin, bırakılan verileri başarıyla işlemesi durumunda sisteme Boole değeri true döndürmesi beklenir. : Bu adım yalnızca kullanıcı, dinleyicisi sürükleme etkinliklerini alacak şekilde kaydedilmiş bir View öğ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ırsa ACTION_DROP sürükleme etkinliği gönderilmez.
Sona erdi

Kullanıcı sürükleme gölgesini bıraktıktan ve sistem

gerekirse ACTION_DROP iş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çin ACTION_DRAG_ENDED iş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, dinleyici ACTION_DROP etkinliğ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 true değerini döndürür. Aksi takdirde false döndürmelidir.

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 View nesnelerini 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 olmamalı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ğ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 nesnesinde View.DragShadowBuilder nesnesi bulunmaz. Alan null olarak 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: Point nesnesi. Sürükleme gölgesinin genişliği x, yüksekliği ise y içine girer.

outShadowTouchPoint: Point nesnesi. 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 konumu x'ye, Y konumu ise y'e girilir.

onDrawShadow()

onProvideShadowMetrics() çağrısından hemen sonra sistem, sürükleme gölgesini oluşturmak için onDrawShadow() çağrısını yapar. Yöntemin tek bir bağımsız değişkeni vardır: Canvas nesnesi. Bu nesne, sistem tarafından onProvideShadowMetrics() içinde sağladığınız parametrelerden oluşturulur. Yöntem, sağlanan Canvas ü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, ContentInfo nesnesi 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 OnReceiveContentListener iç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.