Sürükle ve bırak

Jetpack Compose, iki değiştiriciyle sürükle ve bırak işlemini destekler:

  • dragAndDropSource: Bir bileşeni sürükleme hareketinin başlangıç noktası olarak belirtir
  • dragAndDropTarget: Bırakılan verileri kabul eden bir derlenebilir öğeyi belirtir

Örneğin, kullanıcıların uygulamanızda bir resmi sürüklemesini sağlamak için bir resim bileşimi oluşturun ve dragAndDropSource değiştiricisini ekleyin. Bir bırakma hedefi oluşturmak için başka bir resim bileşimi oluşturun ve dragAndDropTarget değiştiricisini ekleyin.

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

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

Bir sürükleme kaynağı belirtin

Bir bileşen içinde sürükleme etkinliklerini etkinleştirmek için dragAndDropSource değiştiricisini ekleyin. Bu işlev, parametre olarak bir işlev alır. Bu işlevin içinde, aktarılabilir verileri temsil etmek için DragAndDropTransferData kullanın. Veriler uzak bir URI, panosundaki zengin metin verileri, yerel bir dosya veya başka bir şey olabilir ancak bunların hepsinin bir ClipData nesnesine sarmalanması gerekir. Düz metin sağlayın. Örneğin:

Modifier.dragAndDropSource { _ ->
    DragAndDropTransferData(
        ClipData.newPlainText(
            "image Url", url
        )
    )
}

Sürükle işleminin uygulamanın sınırlarını aşmasına izin vermek için DragAndDropTransferData kurucusu bir flags bağımsız değişkeni kabul eder. Aşağıdaki örnekte DRAG_FLAG_GLOBAL sabit ifadesi, 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şaretçilerin tam listesi için Görünüm sabitlerinin listesine bakın.

Düşüş verilerini alma

Bir bileşenin sürükle ve bırak etkinlikleri almasını sağlamak için dragAndDropTarget değiştiricisini bileşene atayın. Değiştiricinin iki parametresi vardır: Birincisi 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şlevinde sunar.

Geri arama örneğinin hatırlanması gerektiğini unutmayın. Aşağıdaki snippet'te, geri aramanın 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 almak için requestDragAndDropPermission simgesini kullanarak verileri almayı etkinleştirin ve işlem tamamlandığında simgeyi 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ştur 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 tüketiliyorsa true, etkinlik reddedildiyse ve üst bileşene iletilmiyorsa false döndürmelidir.

Sürükle ve bırak etkinliklerini işleme

Kullanıcı arayüzünü ve uygulamanın davranışını hassas bir şekilde kontrol etmek için bir sürükle ve bırak etkinliğinin ne zaman başladığını, sona erdiğini veya bir bileşene girip çıktığını gözlemlemek üzere DragAndDropTarget arayüzündeki geri çağırma işlevlerini 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ükle ve bırak