Sürükleyin ve bırakın

Jetpack Compose, sürükle ve bırak özelliğini iki değiştiriciyle 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 resim sürüklemelerini sağlamak için bir composable oluşturup dragAndDropSource değiştiricisini ekleyin. Lansman hedefi ayarlamak için başka bir resim composable oluşturup dragAndDropTarget değiştiriciyi ekleyin.

Değiştiriciler birden fazla sürükleme kaynağına ve bırakma hedefine uygulanabilir.

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

Sürükleme etkinliği başlatma

Bir bileşen içindeki sürükleme etkinliklerini etkinleştirmek için parametre olarak askıya alma işlevi alan dragAndDropSource değiştiricisini ekleyin. İş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 gibi uzun basmayla gerçekleştirilir:

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

Sürükleyip bırakma oturumu başlatmak için startTransfer() işlevini çağırın. Bu kapsamda, aktarılabilir verileri temsil etmek için DragAndDropTransferData kullanın. Veriler bir uzak URI, panodaki zengin metin verileri, yerel bir dosya veya daha fazlasını içerebilir ancak bunların bir ClipData nesnesine sarmalanması gerekir. Aşağıdaki gibi bir düz metin ekleyin:

Modifier.dragAndDropSource {
    detectTapGestures(onLongPress = {
        startTransfer(
            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şturucu bir flags bağımsız değişkenini kabul eder. Aşağıdaki örnekte DRAG_FLAG_GLOBAL sabiti, 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. Mevcut işaretlerin kapsamlı listesi için View sabitleri listesine bakın.

Lansman verilerini al

Sürükleyip bırakma etkinliklerini alabilmek için bir composable'a dragAndDropTarget değiştiricisini 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ğırmada 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
        }
    }
}

Sonraki snippet, bırakılan düz metnin nasıl işleneceğini gösterir:

Modifier.dragAndDropTarget(
    shouldStartDragAndDrop = { event ->
        event.mimeTypes().contains(ClipDescription.MIMETYPE_TEXT_PLAIN)
    }, target = callback
)

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

Sürükleyip bırakma etkinliklerini yönetme

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