Операции перетаскивания
Вы можете настроить приложение Compose Multiplatform так, чтобы оно принимало данные, которые пользователи перетаскивают в него из других приложений, или позволяло перетаскивать данные из вашего приложения в другие приложения. Для этого используйте модификаторы dragAndDropSource и dragAndDropTarget, чтобы указать компонуемые функции в качестве возможных источников или целей операций перетаскивания.
Обработка данных с учётом платформы
Хотя модификаторы dragAndDropSource и dragAndDropTarget входят в общий API, передаваемые данные необходимо оборачивать в типы, специфичные для платформы:
-
Для Android оберните данные в объект
ClipDataиз Android.Modifier.dragAndDropSource { _ -> DragAndDropTransferData( ClipData.newPlainText( "text", text ) ) } -
Для iOS оберните данные в
UIDragItemиз UIKit.Modifier.dragAndDropSource { DragAndDropTransferData( listOf(UIDragItem.fromString(text))) } -
Для настольных платформ оберните данные в
datatransfer.Transferableиз AWT.Modifier.dragAndDropSource { offset -> DragAndDropTransferData( transferable = DragAndDropTransferable( StringSelection(text) ) ) } -
Для веб-платформы оберните данные в объект
DataTransfer.Modifier.dragAndDropSource { _: Offset -> val dataTransfer = createDataTransfer() dataTransfer.setData("text/plain", text) DragAndDropTransferData(dataTransfer) }
Создание источника перетаскивания
Чтобы подготовить компонуемую функцию в качестве источника перетаскивания:
Примените к компонуемой функции модификатор
dragAndDropSource.(Необязательно) Добавьте лямбду
drawDragDecoration, чтобы настроить визуальное представление, отображаемое во время перетаскивания данных пользователем.Верните экземпляр
DragAndDropTransferDataс описанием передаваемых данных, поддерживаемых действий и обработки завершения.
В следующем примере для настольной платформы компонуемая функция Box() настраивается как источник перетаскивания, предоставляющий для передачи строку. Реализация остаётся одинаковой для всех платформ, различаются только типы обёрток для данных.
Создание цели перетаскивания
Чтобы подготовить компонуемую функцию в качестве цели перетаскивания:
Создайте объект
DragAndDropTarget(иremember) с переопределениями для обрабатываемых событий перетаскивания. В нашем примере мы переопределимonStarted,onEndedиonDrop.Примените к компонуемой функции модификатор
dragAndDropTarget. Передайте лямбдуshouldStartDragAndDrop, которая определяет, принимает ли цель сеанс, а также объектDragAndDropTarget.
В следующем примере для настольной платформы компонуемая функция Box() настраивается как цель перетаскивания, отображающая текст, перетащенный в неё:
Чтобы увидеть перетаскивание в действии, разместите рядом друг с другом обе компонуемые функции Box() с указанными dragAndDropSource и dragAndDropTarget в Row():
Row(
horizontalArrangement = Arrangement.SpaceEvenly,
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.fillMaxSize()
) {
Box(Modifier.dragAndDropSource( /* ... */ )
Box(Modifier.dragAndDropTarget( /* ... */ )
}
Что дальше
Подробные сведения о реализации и распространённых сценариях использования см. в статье Перетаскивание о соответствующих модификаторах в документации Jetpack Compose.
© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/multiplatform/compose-drag-drop.html