Composant Place Markers
Le composant "Repères de lieux" vous permet de créer des annotations de carte personnalisables qui affichent des informations clés sur les lieux directement sur la carte. Vous pouvez afficher des contenus tels que la note d'un lieu, son type, son état (ouvert ou fermé), sa gamme de prix ou du texte personnalisé (par exemple, un libellé généré par IA ou un numéro d'itinéraire). Vos utilisateurs bénéficient ainsi d'une expérience d'exploration de carte plus informative sans avoir à appuyer sur une fiche détaillée d'un lieu.
Vous pouvez afficher une icône de repère et un texte de repère facultatif par PlaceMarker.
Voici les icônes disponibles :
Type: type de lieu.None: aucune icône.
Rating: score de la note.PriceRange: gamme de prix (par exemple, 10 € à 20 €).OpenStatus: indique si un établissement est ouvert ou fermé.Custom: texte personnalisé (par exemple, "POPULAIRE").
Faites référence au lieu à l'aide d'un ID de lieu (PlaceId), d'un nom de ressource (ResourceName) ou de coordonnées géographiques (Coordinates).
Exigences concernant l'affichage et l'attribution
Lorsque des repères de carte du Kit UI pour Places sont affichés, ils ne doivent pas apparaître de manière isolée. Ils doivent être interactifs et ouvrir un composant ou une lightbox associés aux détails du lieu lorsqu'un utilisateur clique ou appuie dessus. Ils doivent également fournir les éléments requis concernant la marque Google, l'attribution des contributeurs et les flux "Signaler un problème".
Consultez nos exigences concernant l'attribution des photos et des avis pour les cas où l'espace est limité.
Exemples de repères
Nous fournissons des fonctions @Composable Jetpack Compose pour éliminer la surcharge du wrapper View-to-Compose et éviter les problèmes d'incompatibilité de thème.
Personnalisation de base des repères
L'exemple de code suivant montre des personnalisations de base des repères de lieu, y compris le masquage du bec triangulaire de la bulle de dialogue pour le repère par défaut.
Kotlin
import androidx.compose.runtime.Composable import com.google.android.libraries.places.compose.PlaceMarker import com.google.android.libraries.places.compose.marker.MarkerIcon import com.google.android.libraries.places.compose.marker.MarkerText import com.google.android.libraries.places.compose.PlaceReference @Composable fun DefaultMarker() { PlaceMarker( reference = PlaceReference.PlaceId("PLACE_ID"), icon = MarkerIcon.None, beakPresence = false, // remove beak ) } @Composable fun RatingMarker() { PlaceMarker( reference = PlaceReference.PlaceId("PLACE_ID"), icon = MarkerIcon.None, text = MarkerText.Rating ) } @Composable fun TypeAndRatingMarker() { PlaceMarker( reference = PlaceReference.PlaceId("PLACE_ID"), icon = MarkerIcon.Type, text = MarkerText.Rating ) } @Composable fun PriceRangeMarker() { PlaceMarker( reference = PlaceReference.ResourceName("places/PLACE_RESOURCE_NAME"), icon = MarkerIcon.None, text = MarkerText.PriceRange ) } @Composable fun OpenStatusMarker() { PlaceMarker( reference = PlaceReference.Coordinates(latitude = 37.7749, longitude = -122.4194), icon = MarkerIcon.None, text = MarkerText.OpenStatus ) } @Composable fun CustomTextMarker() { PlaceMarker( reference = PlaceReference.PlaceId("PLACE_ID"), icon = MarkerIcon.None, // Custom text accepts a String to display a number (e.g. "3") or text (e.g. "NEW") text = MarkerText.Custom("NEW") ) }
Créer un écouteur de clics
Vous pouvez fournir un rappel onClick pour déclencher des actions personnalisées lorsqu'un repère autonome est sélectionné. Toutefois, lorsque le repère est affiché sur une carte (par exemple, dans un MarkerComposable), les événements d'appui sont interceptés par la carte. Dans ce cas, vous devez utiliser le gestionnaire onClick de MarkerComposable au lieu de celui du repère.
L'exemple de code suivant montre comment utiliser le gestionnaire onClick de MarkerComposable.
Kotlin
import android.util.Log import androidx.compose.runtime.Composable import com.google.android.libraries.places.compose.PlaceMarker import com.google.android.libraries.places.compose.marker.MarkerIcon import com.google.android.libraries.places.compose.PlaceReference /** * PlaceMarker used outside of a map (e.g. in a list, bottom sheet, or custom overlay). * * There is no host component that provides a default click behavior here, so PlaceMarker's own * `onClick` is the only way for a developer to react to a tap. This is why `onClick` must stay * on the PlaceMarker API. */ @Composable fun ClickableMarkerWithCustomConfig() { PlaceMarker( reference = PlaceReference.PlaceId("PLACE_ID"), icon = MarkerIcon.Type, onClick = { place -> openPlaceCard(place.id) // developer might want to open the place card Log.i("PlacesMarker", "Marker was tapped by user!") } ) } /** * PlaceMarker used as the content of a MarkerComposable on a GoogleMap. * * MarkerComposable does NOT add PlaceMarker to the touch-input hierarchy: it snapshots the * composable into a bitmap and hands that bitmap to the Maps renderer as the marker icon. The * rendered marker is a map object, not a Compose node, so: * * - PlaceMarker's own `onClick` would never be invoked here (no touch events ever reach it). * - The tap is delivered by the Maps SDK to MarkerComposable's `onClick`, which is the only * click entry point on a map. * * Accordingly, the state-based `PlaceMarker(state = ...)` overload used below deliberately does * not expose an `onClick` parameter, so the correct handler is the only one available. */ @Composable fun PlaceMarkerOnMap(markerState: PlaceMarkerState) { GoogleMap( modifier = Modifier.fillMaxSize(), cameraPositionState = rememberCameraPositionState(), ) { markerState.location?.let { position -> MarkerComposable( state = rememberUpdatedMarkerState(position = position), // this is the click handler for the map use case. onClick = { markerState.place?.let { place -> openPlaceCard(place.id) } true // consume the event }, ) { PlaceMarker(state = markerState) } } } }
Gérer l'état de chargement et les rappels
L'exemple de code suivant montre comment fournir des rappels pour gérer les erreurs de rendu ou de données manquantes.
Kotlin
import android.util.Log import androidx.compose.runtime.Composable import com.google.android.libraries.places.compose.PlaceMarker import com.google.android.libraries.places.compose.marker.MarkerIcon import com.google.android.libraries.places.compose.PlaceReference @Composable fun StatusHandlingMarker() { PlaceMarker( reference = PlaceReference.PlaceId("PLACE_ID"), icon = MarkerIcon.Type, // Triggered when attribute data is successfully fetched and the marker is rendered. // Returns a minimal Place object with ID, location (LatLng), and viewport fields set. onMarkerLoaded = { place -> Log.i("PlacesMarker", "Marker successfully loaded for place ID: ${place.id}") }, // Triggered when data fetching fails or required attribute data is missing for the place. // Returns an optional Place object and an Exception describing the root cause. onMarkerLoadFailed = { place, exception -> Log.e("PlacesMarker", "Failed to load marker for place ID: ${place?.id}", exception) } ) }
Utiliser PlaceMarkerState pour placer des repères sur la carte
L'objet Place est renvoyé avec l'emplacement et la fenêtre d'affichage pour vous aider à décider où placer le repère.
Kotlin
// Step 1: Obtain configured handle in a single 1-line call (PlaceMarker mounted internally) val markerState = rememberPlaceMarkerState( reference = PlaceReference.PlaceId(placeId), icon = MarkerIcon.Type ) // Step 2: Pass PlaceMarkerState.location and PlaceMarker(state = PlaceMarkerState) directly to the map marker GoogleMap(...) { markerState.location?.let { position -> MarkerComposable( state = rememberMarkerState(position = position), onClick = { markerState.place?.let { place -> // Handle marker click } true } ) { PlaceMarker(state = markerState) // Render marker UI content directly on map canvas } } }
Mettre à l'échelle un repère à une taille personnalisée
Kotlin
// Off the map: scale with a one-line modifier. // Modifier.scale is a draw-time transform, so the bubble, beak, icon and text all scale together. @Composable fun ScaledMarker() { PlaceMarker( reference = PlaceReference.PlaceId(placeId), icon = MarkerIcon.Type, text = MarkerText.Rating, modifier = Modifier.scale(2.1f), ) } // On the map: scale by overriding LocalDensity. // MarkerComposable snapshots its content into a marker bitmap sized to the measured layout bounds. // Modifier.scale does not change those bounds, so the marker would be clipped and blurry. Scaling // the density re-measures every dp and sp inside the marker, so the bitmap, the layout bounds and // the map hit target all grow with it. @Composable fun ScaledMarkerOnMap(markerState: PlaceMarkerState) { val density = LocalDensity.current val scaledDensity = remember(density) { Density(density = density.density * 2.1f, fontScale = density.fontScale * 2.1f) } GoogleMap(...) { markerState.location?.let { position -> MarkerComposable( state = rememberUpdatedMarkerState(position = position), anchor = Offset(0.5f, 1.0f), ) { CompositionLocalProvider(LocalDensity provides scaledDensity) { PlaceMarker(state = markerState) } } } } }