Skip to content

MapViewStateInterface

MapViewStateInterface is a core component that manages map initialization, camera position, and overall map state. Each map SDK has its own implementation, but MapConductor provides a unified API across all providers.

MapConductor supports 5 map SDKs, each with its own MapViewStateInterface implementation:

  • GoogleMapViewState - Google Maps
  • MapboxViewState - Mapbox Map
  • HereViewState - HERE Map
  • ArcGISMapViewState - ArcGIS Map
  • MapLibreViewState - MapLibre Map
  • isInitialized: StateFlow<InitState>: Tracks the map’s initialization state
    • NotStarted: Map initialization has not started
    • Initializing: Map is currently initializing
    • Initialized: Map is ready to use
    • Failed: Initialization failed
  • cameraPosition: MapCameraPosition: Current camera position and initial camera position when the map loads
  • mapDesignType: ActualMapDesignType: Map style/design (provider-specific)
  • moveCameraTo(GeoPoint, Long?)

    fun moveCameraTo(
    position: GeoPoint,
    durationMillis: Long? = 0,
    )
    • Moves the camera to the specified position. Zoom and tilt angles are maintained from the time moveCameraTo is called.
    • When durationMillis is specified in milliseconds, the camera moves with animation.
@Composable
fun CameraControlExample() {
val london = GeoPoint.fromLatLong(51.4985, 0.0)
val camera = MapCameraPosition(position = london, zoom = 8.0)
val mapViewState = rememberHereMapViewState(cameraPosition = camera)
Column(modifier = modifier) {
Button(
onClick = {
val sanFrancisco = GeoPoint.fromLatLong(37.7749, -122.4194)
mapViewState.moveCameraTo(
position = sanFrancisco,
durationMillis = 3000
)
}
) {
Text("Move to San Francisco")
}
HereMapView(
modifier = Modifier.fillMaxSize(),
state = mapViewState,
onCameraMoveEnd = {
println("Camera movement completed")
}
) {
// Marker, Polygon, etc
}
}
}
@Composable
fun MapDesignSwitchExample() {
val london = GeoPoint.fromLatLong(51.4985, 0.0)
val camera = MapCameraPosition(position = london, zoom = 8.0)
val mapViewState = rememberHereMapViewState(
cameraPosition = camera,
mapDesign = HereMapDesign.NormalDay
)
Column(modifier = modifier) {
Row(modifier = Modifier.fillMaxWidth()) {
Button(
onClick = {
mapViewState.mapDesignType = HereMapDesign.NormalDay
}
) {
Text("NormalDay")
}
Spacer(modifier = Modifier.width(20.dp))
Button(
onClick = {
mapViewState.mapDesignType = HereMapDesign.NormalNight
}
) {
Text("NormalNight")
}
Spacer(modifier = Modifier.width(20.dp))
Button(
onClick = {
mapViewState.mapDesignType = HereMapDesign.HybridDay
}
) {
Text("HYBRID_DAY")
}
}
HereMapView(
state = mapViewState
) {
// Marker, Polyline... etc,
}
}
}

MapViewStateInterface works with your chosen map provider component to provide comprehensive event handling:

// Replace MapView with your chosen map provider, such as GoogleMapView, MapboxMapView
MapView(
state = mapViewState,
onMapLoaded = {
println("Map loaded successfully")
},
onMapClick = { geoPoint ->
println("Map clicked at: ${geoPoint.latitude}, ${geoPoint.longitude}")
}
) {
// Map content
}
  1. State Initialization: Initialize MapViewStateInterface with appropriate camera position and bounds
  2. Camera Animation: Use reasonable animation durations for smooth user experience (500ms - 3000ms)
  3. State Stability: Use remember to maintain state across recompositions
  4. Reactive Updates: Use StateFlow for reactive updates to initialization state
  5. Error Handling: Check initialization state before performing camera operations
  6. Memory Management: Clean up listeners when the map is no longer needed