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 belirtirdragAndDropTarget
: 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