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 composable ve dragAndDropSource değiştiricisini ekleyin. Hedef oluşturmak için başka bir hedef belirleyin composable'ı seçin ve dragAndDropTarget değiştiricisi ekleyin.

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

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

Sürükleme etkinliği başlatma

Bir bileşen içindeki sürükleme etkinliklerini etkinleştirmek için dragAndDropSource değiştiricisini ekleyin, Bu da parametre olarak bir askıya alma işlevini alır. İşlev, kullanıcıyı etkileşimi olan basit bir öğedir. dragAndDropSource değiştirici bir işaretçi giriş etkinliği alana kadar bekler ve ardından lambda'yı yürütür etkinlik işleyiciye iletilir. lambda'yı kullanarak çeşitli giriş etkinliklerini, dokunarak veya uzun basarak yapabilirsiniz. Daha fazla bilgi için bkz. İşaretçi giriş yapı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 kapsam dahilinde, DragAndDropTransferData aktarılabilir verilerdir. Veriler bir uzak URI, esnek metin verileri: yerel bir dosya veya daha fazlası olabilir, ancak tüm öğelerin tek bir ClipData nesne algılandı. 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 kurucusu, flags bağımsız değişkenini kabul eder. aşağıdaki örnekte DRAG_FLAG_GLOBAL sabiti, verilerin sürüklenebilir:

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. Görüntüleyin Mevcut işaretlerin kapsamlı listesi için View sabit değerlerinin listesini inceleyin.

Lansman verilerini al

Bir composable'ı etkinleştirmek için dragAndDropTarget değiştiricisini bir composable'a atayın almak için kullanabileceğiniz bir araçtır. Değiştiricinin iki parametresi vardır: birinci değiştiricinin kabul edebileceği veri türünü belirler ve ikincisi bir geri aramada verileri sunar.

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

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 kullanılırsa true veya false değerini döndürmelidir etkinlik reddedilir ve üst bileşene yayılmazsa.

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

Şu durumda gözlemlemek için DragAndDropTarget arayüzünde geri çağırmaları geçersiz kılın: Sürükleyip bırakma etkinliği, kesin sonuç vermek üzere bir bileşene girerken, biter veya bir bileşene girer ya da bileşenden çıkar Kullanıcı arayüzünün ve uygulamanın davranışının kontrolü:

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