Ability to customise onDrag functionality #11
4
demo/maps/src/jvmMain/kotlin/AngleConversion.kt
Normal file
4
demo/maps/src/jvmMain/kotlin/AngleConversion.kt
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
import kotlin.math.PI
|
||||||
|
|
||||||
|
fun Double.toDegrees() = this * 180 / PI
|
||||||
|
|
@ -48,17 +48,26 @@ fun App() {
|
|||||||
var centerCoordinates by remember { mutableStateOf<GeodeticMapCoordinates?>(null) }
|
var centerCoordinates by remember { mutableStateOf<GeodeticMapCoordinates?>(null) }
|
||||||
|
|
||||||
|
|
||||||
|
val pointOne = 55.568548 to 37.568604
|
||||||
|
var pointTwo by remember { mutableStateOf(55.929444 to 37.518434) }
|
||||||
|
val pointThree = 60.929444 to 37.518434
|
||||||
MapView(
|
MapView(
|
||||||
mapTileProvider = mapTileProvider,
|
mapTileProvider = mapTileProvider,
|
||||||
initialViewPoint = viewPoint,
|
initialViewPoint = viewPoint,
|
||||||
config = MapViewConfig(
|
config = MapViewConfig(
|
||||||
inferViewBoxFromFeatures = true,
|
inferViewBoxFromFeatures = true,
|
||||||
onViewChange = { centerCoordinates = focus }
|
onViewChange = { centerCoordinates = focus },
|
||||||
|
onDrag = { start, end ->
|
||||||
|
if (start.focus.latitude.toDegrees() in (pointTwo.first - 0.05)..(pointTwo.first + 0.05) &&
|
||||||
|
start.focus.longitude.toDegrees() in (pointTwo.second - 0.05)..(pointTwo.second + 0.05)
|
||||||
|
) {
|
||||||
|
pointTwo = pointTwo.first + (end.focus.latitude - start.focus.latitude).toDegrees() to
|
||||||
|
pointTwo.second + (end.focus.longitude - start.focus.longitude).toDegrees()
|
||||||
|
false// returning false, because when we are dragging circle we don't want to drag map
|
||||||
|
} else true
|
||||||
|
}
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
val pointOne = 55.568548 to 37.568604
|
|
||||||
val pointTwo = 55.929444 to 37.518434
|
|
||||||
val pointThree = 60.929444 to 37.518434
|
|
||||||
|
|
||||||
image(pointOne, Icons.Filled.Home)
|
image(pointOne, Icons.Filled.Home)
|
||||||
|
|
||||||
@ -74,7 +83,7 @@ fun App() {
|
|||||||
|
|
||||||
arc(pointOne, Distance(10.0), 0f, PI)
|
arc(pointOne, Distance(10.0), 0f, PI)
|
||||||
|
|
||||||
line(pointOne, pointTwo)
|
line(pointOne, pointTwo, id = "line")
|
||||||
text(pointOne, "Home", font = { size = 32f })
|
text(pointOne, "Home", font = { size = 32f })
|
||||||
|
|
||||||
centerCoordinates?.let {
|
centerCoordinates?.let {
|
||||||
|
@ -11,10 +11,15 @@ import kotlin.math.min
|
|||||||
|
|
||||||
|
|
||||||
//TODO consider replacing by modifier
|
//TODO consider replacing by modifier
|
||||||
|
/**
|
||||||
|
* @param onDrag - returns true if you want to drag a map and false, if you want to make map stationary.
|
||||||
|
* start - is a point where drag begins, end is a point where drag ends
|
||||||
|
*/
|
||||||
public data class MapViewConfig(
|
public data class MapViewConfig(
|
||||||
val zoomSpeed: Double = 1.0 / 3.0,
|
val zoomSpeed: Double = 1.0 / 3.0,
|
||||||
val inferViewBoxFromFeatures: Boolean = false,
|
val inferViewBoxFromFeatures: Boolean = false,
|
||||||
val onClick: MapViewPoint.() -> Unit = {},
|
val onClick: MapViewPoint.() -> Unit = {},
|
||||||
|
val onDrag: (start: MapViewPoint, end: MapViewPoint) -> Boolean = { _, _ -> true },
|
||||||
val onViewChange: MapViewPoint.() -> Unit = {},
|
val onViewChange: MapViewPoint.() -> Unit = {},
|
||||||
val onSelect: (GmcBox) -> Unit = {},
|
val onSelect: (GmcBox) -> Unit = {},
|
||||||
val zoomOnSelect: Boolean = true,
|
val zoomOnSelect: Boolean = true,
|
||||||
|
@ -146,6 +146,14 @@ public actual fun MapView(
|
|||||||
config.onClick(MapViewPoint(dpPos.toGeodetic(), viewPoint.zoom))
|
config.onClick(MapViewPoint(dpPos.toGeodetic(), viewPoint.zoom))
|
||||||
drag(change.id) { dragChange ->
|
drag(change.id) { dragChange ->
|
||||||
val dragAmount = dragChange.position - dragChange.previousPosition
|
val dragAmount = dragChange.position - dragChange.previousPosition
|
||||||
|
val dpStart =
|
||||||
|
DpOffset(dragChange.previousPosition.x.toDp(), dragChange.previousPosition.y.toDp())
|
||||||
|
val dpEnd = DpOffset(dragChange.position.x.toDp(), dragChange.position.y.toDp())
|
||||||
|
if (!config.onDrag(
|
||||||
|
MapViewPoint(dpStart.toGeodetic(), viewPoint.zoom),
|
||||||
|
MapViewPoint(dpEnd.toGeodetic(), viewPoint.zoom)
|
||||||
|
)
|
||||||
|
) return@drag
|
||||||
val newViewPoint = viewPoint.move(
|
val newViewPoint = viewPoint.move(
|
||||||
-dragAmount.x.toDp().value / tileScale,
|
-dragAmount.x.toDp().value / tileScale,
|
||||||
+dragAmount.y.toDp().value / tileScale
|
+dragAmount.y.toDp().value / tileScale
|
||||||
|
Loading…
Reference in New Issue
Block a user