Sürükle ve bırak

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

Değiştiriciler, uygulamaların View uygulamalarıyla birlikte çalışabilen ClipData özelliğini kullanarak iki veya daha fazla composable arasında veri paylaşmasını sağlar.

Drag etkinliği başlat

Bir bileşenin içinde sürükleme etkinliklerini etkinleştirmek için askıya alma işlevini parametre olarak alan dragAndDropSource değiştiricisini ekleyin. Bu işlev, sürükleme işlemini başlatan kullanıcı etkileşimini tanımlar. dragAndDropSource değiştiricisi, bir işaretçi giriş etkinliği alana kadar bekler ve ardından etkinlik işleyiciye iletilen lambdayı yürütür. Dokunma veya uzun basma gibi çeşitli giriş etkinliklerini algılamak için lambda'yı kullanın. Daha fazla bilgi için Oluşturma'da işaretçi girişi bölümüne bakın.

İşaretçi giriş etkinliği genellikle aşağıdaki şekilde uygulanan bir uzun basmadır:

Modifier.dragAndDropSource {
    detectTapGestures(onLongPress = {
        // Transfer data here.
    })
}

Sürükle ve bırak oturumu başlatmak için startTransfer() işlevini çağırın. Bu kapsam dahilinde, aktarılabilir verileri temsil etmek için DragAndDropTransferData simgesini kullanın. Veriler uzak bir URI, panodaki zengin metin verileri, yerel bir dosya veya daha fazlası olabilir. Ancak hepsinin bir ClipData nesnesi içine sarmalanması gerekir. Düz metin sağlayın. Örneğin, aşağıdaki gibi bir düz metin girin:

Modifier.dragAndDropSource {
    detectTapGestures(onLongPress = {
        startTransfer(
            DragAndDropTransferData(
                ClipData.newPlainText(
                    "image Url", url
                )
            )
        )
    })
}

DragAndDropTransferData oluşturucu, sürükleme işleminin uygulamanın sınırlarını aşmasına izin vermek için flags bağımsız değişkenini kabul eder. Aşağıdaki örnekte DRAG_FLAG_GLOBAL sabit değeri, verilerin bir uygulamadan diğerine sürüklenebileceğini belirtir:

Modifier.dragAndDropSource {
    detectTapGestures(onLongPress = {
        startTransfer(
            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ı listesi için View sabitlerinin listesine bakın.

Lansman verilerini al

composable'ın sürükle ve bırak etkinliklerini almasını sağlamak için dragAndDropTarget değiştiricisini bir composable'a atayın. Değiştiricinin iki parametresi vardır: İlki bir filtre görevi görür ve değiştiricinin kabul edebileceği veri türünü belirtir. İkincisi ise verileri bir geri çağırma işleminde sunar.

Geri çağırma örneğinin hatırlanması gerektiğini unutmayın. Aşağıdaki snippet'te geri çağırmanın nasıl hatırlanacağı gösterilmektedir:

val callback = remember {
    object : DragAndDropTarget {
        override fun onDrop(event: DragAndDropEvent): Boolean {
            // Parse received data
            return true
        }
    }
}

Bir sonraki 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
)

Geri çağırma işlevi, etkinlik tüketilirse true veya etkinlik reddedildiyse ve üst bileşene yayılmazsa false değerini döndürmelidir.

Sürükleyip bırakma etkinliklerini işleme

Kullanıcı arayüzü ve uygulama davranışını hassas bir şekilde kontrol edebilmek için bir sürükle ve bırak etkinliğinin ne zaman başladığını, sona erdiğini veya bir bileşene ne zaman girdiğini ya da bileşenden ne zaman çıktığını gözlemlemek için 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 penceresinde sürükleme ve bırakma