diff --git a/maps-app/src/main/java/com/google/maps/android/compose/markerexamples/AdvancedMarkersActivity.kt b/maps-app/src/main/java/com/google/maps/android/compose/markerexamples/AdvancedMarkersActivity.kt index 7ded2f1f..98d082b8 100644 --- a/maps-app/src/main/java/com/google/maps/android/compose/markerexamples/AdvancedMarkersActivity.kt +++ b/maps-app/src/main/java/com/google/maps/android/compose/markerexamples/AdvancedMarkersActivity.kt @@ -45,6 +45,7 @@ import com.google.maps.android.compose.MapProperties import com.google.maps.android.compose.MapType import com.google.maps.android.compose.rememberCameraPositionState import com.google.maps.android.compose.rememberUpdatedMarkerState +import com.google.maps.android.ui.IconGenerator private const val TAG = "AdvancedMarkersActivity" @@ -53,6 +54,7 @@ private val santiago = LatLng(-33.4489, -70.6693) private val bogota = LatLng(-4.7110, -74.0721) private val lima = LatLng(-12.0464, -77.0428) private val salvador = LatLng(-12.9777, -38.5016) +private val caracas = LatLng(10.4785, -66.9016) private val center = LatLng(-18.000, -58.000) private val defaultCameraPosition1 = CameraPosition.fromLatLngZoom(center, 2f) class AdvancedMarkersActivity : ComponentActivity(), OnMapsSdkInitializedCallback { @@ -74,6 +76,7 @@ class AdvancedMarkersActivity : ComponentActivity(), OnMapsSdkInitializedCallbac val marker2State = rememberUpdatedMarkerState(position = bogota) val marker3State = rememberUpdatedMarkerState(position = lima) val marker4State = rememberUpdatedMarkerState(position = salvador) + val marker5State = rememberUpdatedMarkerState(position = caracas) // Drawing on the map is accomplished with a child-based API val markerClick: (Marker) -> Boolean = { @@ -112,6 +115,25 @@ class AdvancedMarkersActivity : ComponentActivity(), OnMapsSdkInitializedCallbac title="Marker 4" ) + val icon = remember { + val iconGenerator = IconGenerator(this@AdvancedMarkersActivity) + val contentView = TextView(this@AdvancedMarkersActivity) + contentView.text = "Caracas" + contentView.setBackgroundColor(Color.BLACK) + contentView.setTextColor(Color.YELLOW) + iconGenerator.setBackground(null) + iconGenerator.setContentView(contentView) + val bitmap = iconGenerator.makeIcon() + BitmapDescriptorFactory.fromBitmap(bitmap) + } + AdvancedMarker( + state = marker5State, + onClick = markerClick, + collisionBehavior = 1, + icon = icon, + title = "Marker 5" + ) + val pinConfig = PinConfig.builder() .setBackgroundColor(Color.MAGENTA) .setBorderColor(Color.WHITE) diff --git a/maps-app/src/main/java/com/google/maps/android/compose/markerexamples/MarkerClusteringActivity.kt b/maps-app/src/main/java/com/google/maps/android/compose/markerexamples/MarkerClusteringActivity.kt index d94a44fa..4deded30 100644 --- a/maps-app/src/main/java/com/google/maps/android/compose/markerexamples/MarkerClusteringActivity.kt +++ b/maps-app/src/main/java/com/google/maps/android/compose/markerexamples/MarkerClusteringActivity.kt @@ -250,6 +250,7 @@ fun CustomRendererClustering(items: List) { clusterManager = clusterManager, ) } + } @Composable diff --git a/maps-compose/src/main/java/com/google/maps/android/compose/Marker.kt b/maps-compose/src/main/java/com/google/maps/android/compose/Marker.kt index e44a1e18..b2450806 100644 --- a/maps-compose/src/main/java/com/google/maps/android/compose/Marker.kt +++ b/maps-compose/src/main/java/com/google/maps/android/compose/Marker.kt @@ -719,6 +719,7 @@ private fun MarkerImpl( * @param onInfoWindowClick a lambda invoked when the marker's info window is clicked * @param onInfoWindowClose a lambda invoked when the marker's info window is closed * @param onInfoWindowLongClick a lambda invoked when the marker's info window is long clicked + * @param icon sets the icon for the marker * @param pinConfig the PinConfig object that will be used for the advanced marker * @param iconView the custom view to be used on the advanced marker * @param collisionBehavior the expected collision behavior @@ -743,6 +744,7 @@ public fun AdvancedMarker( onInfoWindowClick: (Marker) -> Unit = {}, onInfoWindowClose: (Marker) -> Unit = {}, onInfoWindowLongClick: (Marker) -> Unit = {}, + icon: BitmapDescriptor? = null, pinConfig: PinConfig? = null, iconView: View? = null, collisionBehavior: Int = AdvancedMarkerOptions.CollisionBehavior.REQUIRED @@ -765,6 +767,7 @@ public fun AdvancedMarker( onInfoWindowClick = onInfoWindowClick, onInfoWindowClose = onInfoWindowClose, onInfoWindowLongClick = onInfoWindowLongClick, + icon = icon, pinConfig = pinConfig, iconView = iconView, collisionBehavior = collisionBehavior @@ -797,6 +800,7 @@ public fun AdvancedMarker( * will be ignored. * @param infoContent optional composable lambda expression for customizing * the info window's content. If this value is non-null, [infoWindow] must be null. + * @param icon sets the icon for the marker * @param pinConfig the PinConfig object that will be used for the advanced marker * @param iconView the custom view to be used on the advanced marker * @param collisionBehavior the expected collision behavior @@ -823,6 +827,7 @@ private fun AdvancedMarkerImpl( onInfoWindowLongClick: (Marker) -> Unit = {}, infoWindow: (@Composable (Marker) -> Unit)? = null, infoContent: (@Composable (Marker) -> Unit)? = null, + icon: BitmapDescriptor? = null, pinConfig: PinConfig? = null, iconView: View? = null, collisionBehavior: Int = AdvancedMarkerOptions.CollisionBehavior.REQUIRED @@ -836,10 +841,18 @@ private fun AdvancedMarkerImpl( val advancedMarkerOptions = AdvancedMarkerOptions() .position(state.position) .collisionBehavior(collisionBehavior) + + // Determine the icon for the marker in order of precedence: + // 1. Use iconView if provided (takes full precedence and overrides all). + // 2. If no iconView, use pinConfig to generate a BitmapDescriptor. + // 3. If neither iconView nor pinConfig are available, fall back to the raw icon. + if (iconView != null) { advancedMarkerOptions.iconView(iconView) } else if (pinConfig != null) { advancedMarkerOptions.icon(BitmapDescriptorFactory.fromPinConfig(pinConfig)) + } else if (icon != null) { + advancedMarkerOptions.icon(icon) } advancedMarkerOptions.contentDescription(contentDescription) advancedMarkerOptions.alpha(alpha) @@ -897,7 +910,7 @@ private fun AdvancedMarkerImpl( } } update(pinConfig) { - if (iconView == null) { + if (icon == null && iconView == null) { this.marker.setIcon(pinConfig?.let { it1 -> BitmapDescriptorFactory.fromPinConfig( it1 @@ -905,6 +918,11 @@ private fun AdvancedMarkerImpl( }) } } + update(icon) { + if (iconView == null) { + this.marker.setIcon(it) + } + } update(visible) { this.marker.isVisible = it } update(zIndex) { this.marker.zIndex = it }