Jetpack Compose, iki değiştiriciyle sürükle ve bırak özelliğini destekler:
dragAndDropSource: Sürükleme hareketinin başlangıç noktası olarak bir composable belirtir.dragAndDropTarget: Bırakılan verileri kabul eden bir composable belirtir.
Örneğin, kullanıcıların uygulamanızda bir resmi sürüklemesini sağlamak için bir resim composable'ı oluşturun ve dragAndDropSource değiştiricisini ekleyin. Bırakma hedefi oluşturmak için başka bir resim composable'ı oluşturun ve dragAndDropTarget değiştiricisini ekleyin.
Değiştiriciler birden fazla sürükleme kaynağına ve birden fazla bırakma hedefine uygulanabilir.
Değiştiriciler, uygulamaların ClipData kullanarak iki veya daha fazla composable arasında paylaşılan verileri paylaşmasına olanak tanır. Bu, View uygulamalarıyla birlikte çalışabilir.
Sürükleme kaynağı belirtme
Bir bileşen içinde sürükleme etkinliklerini etkinleştirmek için dragAndDropSource değiştiricisini ekleyin.
Bu, parametre olarak bir işlev alır. Bu işlevde, aktarılabilir verileri temsil etmek için DragAndDropTransferData kullanın. Veriler uzak URI, panodaki zengin metin verileri, yerel dosya veya başka bir şey olabilir ancak hepsinin bir ClipData nesnesine sarmalanması gerekir. Düz metin sağlayın. Örneğin:
Modifier.dragAndDropSource { _ -> DragAndDropTransferData( ClipData.newPlainText( "image Url", url ) ) }
Sürükleme işleminin uygulamanın sınırlarını aşmasına izin vermek için DragAndDropTransferData oluşturucusu bir flags bağımsız değişkeni kabul eder. Aşağıdaki örnekte, DRAG_FLAG_GLOBAL sabiti, verilerin bir uygulamadan diğerine sürüklenebileceğini belirtir:
Modifier.dragAndDropSource { _ -> DragAndDropTransferData( ClipData.newPlainText( "image Url", url ), flags = View.DRAG_FLAG_GLOBAL ) }
DragAndDropTransferData, Android View sistemi tarafından desteklenen işaretleri kabul eder.
Kullanılabilir işaretlerin kapsamlı bir listesi için Görünüm sabitleri listesine bakın.
Bırakma verilerini alma
Oluşturulabilir öğenin sürükle ve bırak etkinliklerini alabilmesi için dragAndDropTarget değiştiricisini oluşturulabilir öğeye atayın. Değiştiricinin iki parametresi vardır: İlki filtre görevi görür ve değiştiricinin kabul edebileceği veri türünü belirtir. İkincisi ise verileri bir geri çağırmada sunar.
Geri çağırma örneğinin hatırlanması gerektiğini unutmayın. Aşağıdaki snippet'te geri çağırma işlevinin nasıl hatırlanacağı gösterilmektedir:
val callback = remember { object : DragAndDropTarget { override fun onDrop(event: DragAndDropEvent): Boolean { // Parse received data return true } } }
Diğer uygulamalardan veri kabul etmek için requestDragAndDropPermission kullanarak alımı etkinleştirin ve işlem tamamlandığında serbest bırakın:
val externalAppCallback = remember { object : DragAndDropTarget { override fun onDrop(event: DragAndDropEvent): Boolean { val permission = activity.requestDragAndDropPermissions(event.toAndroidDragEvent()) // Parse received data permission?.release() return true } } }
Oluşturma geri çağırma işlevinden döndürülen DragAndDropEvent değerinin, requestDragAndDropPermission yöntemi tarafından beklenen değerden farklı olduğunu unutmayın. Bu nedenle, parametreyi izin isteğine iletmeden önce parametrede toAndroidDragEvent() uzantı işlevini çağırmanız gerekir.
Aşağıdaki snippet'te, bırakılan düz metnin nasıl işleneceği gösterilmektedir:
Modifier.dragAndDropTarget( shouldStartDragAndDrop = { event -> event.mimeTypes().contains(ClipDescription.MIMETYPE_TEXT_PLAIN) }, target = callback // or externalAppCallback )
Geri çağırma işlevi, etkinlik kullanılıyorsa true, etkinlik reddediliyorsa ve üst bileşene yayılmıyorsa false değerini döndürmelidir.
Sürükle ve bırak etkinliklerini yönetme
Kullanıcı arayüzü ve uygulamanın davranışı üzerinde hassas kontrol sağlamak için sürükle ve bırak etkinliğinin ne zaman başladığını, bittiğini veya bir bileşene ne zaman girdiğini ya da çıktığını gözlemlemek üzere DragAndDropTarget arayüzündeki geri çağırmaları geçersiz kılın:
object : DragAndDropTarget { override fun onStarted(event: DragAndDropEvent) { // When the drag event starts } override fun onEntered(event: DragAndDropEvent) { // When the dragged object enters the target surface } override fun onEnded(event: DragAndDropEvent) { // When the drag event stops } override fun onExited(event: DragAndDropEvent) { // When the dragged object exits the target surface } override fun onDrop(event: DragAndDropEvent): Boolean = true }
Ek kaynaklar
Codelab: Oluşturma modunda sürükle ve bırak