W Jetpack Compose możesz przeciągać i upuszczać elementy za pomocą dwóch modyfikatorów:
dragAndDropSource
: określa funkcję kompozycyjną jako punkt początkowy gestu przeciąganiadragAndDropTarget
: określa element kompozycyjny, który akceptuje usunięte dane.
Na przykład aby umożliwić użytkownikom przeciąganie obrazu w aplikacji, utwórz kompozycję obrazu
i dodaj modyfikator dragAndDropSource
. Aby skonfigurować docelowy spadek, utwórz inny
kompozycyjnego obrazu i dodać modyfikator dragAndDropTarget
.
Modyfikatory można stosować do wielu źródeł przeciągania i wielu elementów docelowych.
Modyfikatory umożliwiają aplikacjom współdzielenie danych między 2 lub większą liczbą elementów kompozycyjnych
przy użyciu narzędzia ClipData
, które współpracuje z implementacjami View
.
Rozpoczynanie zdarzenia przeciągania
Aby włączyć zdarzenia przeciągania wewnątrz komponentu, dodaj modyfikator dragAndDropSource
,
który przyjmuje funkcję zawieszania jako parametr. Funkcja definiuje użytkownika
która rozpoczyna operację przeciągania. Modyfikator dragAndDropSource
czeka na otrzymanie zdarzenia wejściowego wskaźnika, a następnie wykonuje funkcję lambda
przekazywane do modułu obsługi zdarzeń. Funkcja lambda umożliwia wykrywanie różnych zdarzeń wejściowych,
np. dotknięć lub przytrzymania. Więcej informacji znajdziesz w sekcji Wskaźnik
dane wejściowe w narzędziu Compose.
Zdarzenie danych wejściowych wskaźnika jest zwykle długie i naciśnięte w ten sposób:
Modifier.dragAndDropSource {
detectTapGestures(onLongPress = {
// Transfer data here.
})
}
Aby rozpocząć sesję przeciągania i upuszczania, wywołaj funkcję startTransfer()
.
W tym zakresie użyj wartości DragAndDropTransferData
do reprezentowania funkcji
dane, które można przenieść. Dane te mogą być zdalnym identyfikatorem URI, danymi tekstowymi sformatowanym na
w schowku, pliku lokalnym itp., ale wszystkie muszą być umieszczone w
ClipData
obiekt. Podaj zwykły tekst, na przykład w taki sposób:
Modifier.dragAndDropSource {
detectTapGestures(onLongPress = {
startTransfer(
DragAndDropTransferData(
ClipData.newPlainText(
"image Url", url
)
)
)
})
}
Aby umożliwić przeciąganie po granicach aplikacji,
Konstruktor DragAndDropTransferData
akceptuje argument flags
. W
W tym przykładzie stała DRAG_FLAG_GLOBAL
określa, że dane mogą
zostać przeciągnięta z jednej aplikacji do drugiej:
Modifier.dragAndDropSource {
detectTapGestures(onLongPress = {
startTransfer(
DragAndDropTransferData(
ClipData.newPlainText(
"image Url", url
),
flags = View.DRAG_FLAG_GLOBAL
)
)
})
}
DragAndDropTransferData
akceptuje flagi obsługiwane przez system Android View. Zobacz
listę stałych View, gdzie znajdziesz pełną listę dostępnych flag.
Odbieranie danych o utraconych danych
Przypisz modyfikator dragAndDropTarget
do funkcji kompozycyjnej, aby włączyć tę funkcję
aby odbierać zdarzenia przeciągania i upuszczania. Modyfikator ma dwa parametry: pierwszy
działa jak filtr i określa rodzaj danych akceptowanych przez modyfikator, a funkcja
dostarcza dane w wywołaniu zwrotnym.
Wystąpienie wywołania zwrotnego powinno być zapamiętane. Ten fragment kodu pokazuje, jak zapamiętać wywołanie zwrotne:
val callback = remember {
object : DragAndDropTarget {
override fun onDrop(event: DragAndDropEvent): Boolean {
// Parse received data
return true
}
}
}
Następny fragment kodu pokazuje, jak postępować w przypadku upuszczenia zwykłego tekstu:
Modifier.dragAndDropTarget(
shouldStartDragAndDrop = { event ->
event.mimeTypes().contains(ClipDescription.MIMETYPE_TEXT_PLAIN)
}, target = callback
)
Funkcja wywołania zwrotnego powinna zwracać wartość true
, jeśli zdarzenie zostało wykorzystane, lub false
jeśli zdarzenie zostanie odrzucone i nie zostanie przekazane do komponentu nadrzędnego.
Obsługa zdarzeń przeciągania i upuszczania
Zastąp wywołania zwrotne w interfejsie DragAndDropTarget
, aby zaobserwować, kiedy
zdarzenie typu „przeciągnij i upuść” rozpoczyna się, kończy, otwiera lub opuszcza komponent,
sterowanie interfejsem użytkownika i działaniem aplikacji.
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
}
Dodatkowe materiały
Ćwiczenie w programowaniu: przeciąganie i upuszczanie w narzędziu Compose