From 3f6134a00e9d68d2897db5e1da2c0bb545eee008 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Fri, 8 Aug 2025 08:33:43 +0900 Subject: [PATCH] fix: DefaultIcon cracks 1dp on the top of its graphic --- .../pages/polyline/PolylineMapComponent.kt | 14 ++-- .../example/pages/polyline/PolylineMapPage.kt | 5 +- .../pages/polyline/PolylinePageViewModel.kt | 64 ++++--------------- .../mapconductor/core/marker/DefaultIcon.kt | 2 +- 4 files changed, 23 insertions(+), 62 deletions(-) diff --git a/example-app/src/main/java/com/mapconductor/example/pages/polyline/PolylineMapComponent.kt b/example-app/src/main/java/com/mapconductor/example/pages/polyline/PolylineMapComponent.kt index 8d711c4f..538ae3f5 100644 --- a/example-app/src/main/java/com/mapconductor/example/pages/polyline/PolylineMapComponent.kt +++ b/example-app/src/main/java/com/mapconductor/example/pages/polyline/PolylineMapComponent.kt @@ -3,20 +3,20 @@ package com.mapconductor.example.pages.polyline import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import com.mapconductor.core.map.MapViewState -import com.mapconductor.core.map.OnMapEventHandler import com.mapconductor.core.marker.Marker +import com.mapconductor.core.marker.MarkerState import com.mapconductor.core.marker.OnMarkerEventHandler import com.mapconductor.core.polyline.OnPolylineEventHandler import com.mapconductor.core.polyline.Polyline +import com.mapconductor.core.polyline.PolylineState import com.mapconductor.example.MapViewContainer @Composable fun PolylineMapComponent( mapViewState: MapViewState<*>?, - viewModel: PolylinePageViewModel, + polylineState: PolylineState, + wayPointMarkers: List, modifier: Modifier = Modifier, - onMapClick: OnMapEventHandler = {}, - onMarkerClick: OnMarkerEventHandler = {}, onPolylineClick: OnPolylineEventHandler = {}, onMarkerDrag: OnMarkerEventHandler = {}, ) { @@ -24,16 +24,14 @@ fun PolylineMapComponent( MapViewContainer( modifier = modifier, state = it, - onMapClick = onMapClick, - onMarkerClick = onMarkerClick, onPolylineClick = onPolylineClick, onMarkerDrag = onMarkerDrag, ) { // Polyline - Polyline(viewModel.polylineState) + Polyline(polylineState) // Waypoint markers - viewModel.wayPointMarkers.forEach { marker -> + wayPointMarkers.forEach { marker -> Marker(marker) } } diff --git a/example-app/src/main/java/com/mapconductor/example/pages/polyline/PolylineMapPage.kt b/example-app/src/main/java/com/mapconductor/example/pages/polyline/PolylineMapPage.kt index 37a93a9e..de95aaa9 100644 --- a/example-app/src/main/java/com/mapconductor/example/pages/polyline/PolylineMapPage.kt +++ b/example-app/src/main/java/com/mapconductor/example/pages/polyline/PolylineMapPage.kt @@ -17,10 +17,9 @@ fun PolylineMapPage( val mapViewState = viewModel.mapViewState.collectAsState() PolylineMapComponent( + polylineState = viewModel.polylineState, + wayPointMarkers = viewModel.wayPointMarkers, mapViewState = mapViewState.value, - viewModel = viewModel, - onMapClick = viewModel::onMapClick, - onMarkerClick = viewModel::onMarkerClick, onPolylineClick = viewModel::onPolylineClick, onMarkerDrag = viewModel::onMarkerDrag, ) diff --git a/example-app/src/main/java/com/mapconductor/example/pages/polyline/PolylinePageViewModel.kt b/example-app/src/main/java/com/mapconductor/example/pages/polyline/PolylinePageViewModel.kt index b8278db2..8415c209 100644 --- a/example-app/src/main/java/com/mapconductor/example/pages/polyline/PolylinePageViewModel.kt +++ b/example-app/src/main/java/com/mapconductor/example/pages/polyline/PolylinePageViewModel.kt @@ -12,7 +12,6 @@ import com.mapconductor.core.map.MapViewState import com.mapconductor.core.marker.DefaultIcon import com.mapconductor.core.marker.MarkerState import com.mapconductor.core.polyline.PolylineState -import com.mapconductor.example.toast.ToastMessage import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow @@ -20,31 +19,20 @@ import kotlinx.coroutines.flow.asStateFlow interface PolylinePageViewModel { val initCameraPosition: MapCameraPosition val mapViewState: StateFlow?> - val messages: StateFlow> val wayPointMarkers: List val polylineState: PolylineState fun onMapViewChanged(state: MapViewState<*>) - fun onMarkerClick(clicked: MarkerState) - - fun onMapClick(clicked: GeoPoint) - fun onPolylineClick(state: PolylineState) fun onMarkerDrag(dragged: MarkerState) - - fun showToast(text: String) - - fun removeToast(toastMessage: ToastMessage) } -class PolylinePageViewModelImpl : +class PolylinePageViewModelImpl() : ViewModel(), PolylinePageViewModel { - private val _messages: MutableStateFlow> = MutableStateFlow(emptyList()) - override val messages: StateFlow> = _messages.asStateFlow() override val initCameraPosition = MapCameraPosition( @@ -71,30 +59,24 @@ class PolylinePageViewModelImpl : private val _wayPointMarkers: MutableState> = mutableStateOf( polylinePoints.mapIndexed { index, point -> + val markerColor = when { + index == 0 -> Color.Green + index == polylinePoints.size - 1 -> Color.Green + else -> Color.Yellow + } + val label = when { + index == 0 -> "S" + index == polylinePoints.size - 1 -> "E" + else -> "$index" + } MarkerState( id = "waypoint_$index", position = point, icon = DefaultIcon( - fillColor = - if (index == 0 || - index == polylinePoints.size - 1 - ) { - Color.Green - } else { - Color.Blue - }, - strokeColor = Color.White, - label = - if (index == - 0 - ) { - "S" - } else if (index == polylinePoints.size - 1) { - "E" - } else { - "$index" - }, + fillColor = markerColor, + strokeColor = Color.Black, + label = label, ), draggable = true, ) @@ -125,18 +107,8 @@ class PolylinePageViewModelImpl : this._mapViewState.value = state } - override fun onMarkerClick(clicked: MarkerState) { - val markerLabel = (clicked.icon as? DefaultIcon)?.label ?: "Marker" - showToast("Waypoint $markerLabel clicked") - } - - override fun onMapClick(clicked: GeoPoint) { - showToast("Map clicked at: ${clicked.toUrlValue()}") - } - override fun onPolylineClick(state: PolylineState) { _polylineState.value.strokeColor = Color.Magenta - showToast("Polyline clicked - ${state.points.size} points") } override fun onMarkerDrag(dragged: MarkerState) { @@ -148,14 +120,6 @@ class PolylinePageViewModelImpl : polylinePoints[markerIndex].longitude = dragged.position.longitude } - override fun showToast(text: String) { - this._messages.value = this._messages.value + ToastMessage(text = text) - } - - override fun removeToast(toastMessage: ToastMessage) { - this._messages.value = this._messages.value.filter { it != toastMessage } - } - override fun onCleared() { super.onCleared() } diff --git a/mapconductor-core/src/main/java/com/mapconductor/core/marker/DefaultIcon.kt b/mapconductor-core/src/main/java/com/mapconductor/core/marker/DefaultIcon.kt index 167b84e1..e4e6f0de 100644 --- a/mapconductor-core/src/main/java/com/mapconductor/core/marker/DefaultIcon.kt +++ b/mapconductor-core/src/main/java/com/mapconductor/core/marker/DefaultIcon.kt @@ -141,7 +141,7 @@ abstract class AbstractDefaultIcon( val scaledWidth = originalSize.width * markerScale val scaledHeight = originalSize.height * markerScale val offsetX = (canvasSize - scaledWidth) / 2f - val offsetY = canvasSize - scaledHeight + ResourceProvider.dpToPx(strokeWidth.value - 1f).toFloat() + val offsetY = canvasSize - scaledHeight + ResourceProvider.dpToPx(strokeWidth.value).toFloat() return Path().apply { moveTo(12f * markerScale + offsetX, 0f * markerScale + offsetY)