studio snippet personalizar marcadores google custom android google-maps google-maps-android-api-2 markerclusterer

snippet - Mostrando InfoWindow personalizado para Android Maps Utility Library para Android



personalizar marcadores google maps android studio (2)

Estoy usando la biblioteca Google Maps Utility para Android que permite crear clusters en los mapas y necesito mostrar una InfoWindow personalizada, pero no puedo encontrar ningún método para hacerlo. Para mostrar la ventana de información, tengo la siguiente clase, y en el método onClusterItemRendered es donde tengo acceso a la información del marcador:

class MyClusterRenderer extends DefaultClusterRenderer<MarkerItem> { public MyClusterRenderer(Context context, GoogleMap map, ClusterManager<MarkerItem> clusterManager) { super(context, map, clusterManager); } @Override protected void onBeforeClusterItemRendered(MarkerItem item, MarkerOptions markerOptions) { super.onBeforeClusterItemRendered(item, markerOptions); markerOptions.title(String.valueOf(item.getMarkerId())); } @Override protected void onClusterItemRendered(MarkerItem clusterItem, Marker marker) { super.onClusterItemRendered(clusterItem, marker); } }

¿Hay alguien que haya usado la biblioteca y sepa cómo mostrar una InfoWindow personalizada como la que se usó en Google Maps? Me gusta:

getMap().setInfoWindowAdapter(new InfoWindowAdapter() { @Override public View getInfoWindow(Marker arg0) { return null; } @Override public View getInfoContents(Marker arg0) { return null; } });


Así que básicamente tienes tu clase comenzando así:

private class MarkerItemClusterRenderer extends DefaultClusterRenderer<MarkerItem> { public MarkerItemClusterRenderer(Context context, GoogleMap map, ClusterManager<MarkerItem> clusterManager) { ...

Entonces, en ese map de parámetros del tipo GoogleMap es donde debe especificar su setInfoWindowAdapter .


Si, esto se puede hacer. ClusterManager mantiene dos MarkerManager.Collections :

  • uno para marcadores de clúster, y
  • uno para marcadores de elementos individuales

Puede establecer un InfoWindowAdapter personalizado para cada uno de estos tipos de marcadores de forma independiente.

Implementación

Primero, instale MarkerManager de su ClusterManager como InfoWindowAdapter del mapa:

ClusterManager<MarkerItem> clusterMgr = new ClusterManager<MarkerItem>(context, map); map.setInfoWindowAdapter(clusterMgr.getMarkerManager());

A continuación, instale su InfoWindowAdapter personalizado como el adaptador para una o ambas colecciones de marcadores:

clusterMgr.getClusterMarkerCollection().setOnInfoWindowAdapter(new MyCustomAdapterForClusters()); clusterMgr.getMarkerCollection().setOnInfoWindowAdapter(new MyCustomAdapterForItems());

La última pieza es mapear el objeto Marker procesar que recibirá en la devolución de llamada de su InfoWindowAdapter personalizado al objeto (s) ClusterItem que agregó al mapa en primer lugar. Esto se puede lograr utilizando los detectores onClusterClick y onClusterItemClick, de la siguiente manera:

map.setOnMarkerClickListener(clusterMgr); clusterMgr.setOnClusterClickListener(new OnClusterClickListener<MarkerItem>() { @Override public boolean onClusterClick(Cluster<MarkerItem> cluster) { clickedCluster = cluster; // remember for use later in the Adapter return false; } }); clusterMgr.setOnClusterItemClickListener(new OnClusterItemClickListener<MarkerItem>() { @Override public boolean onClusterItemClick(MarkerItem item) { clickedClusterItem = item; return false; } });

¡Ahora tiene todo lo que necesita para armar su contenido personalizado de InfoWindow en sus respectivos Adaptadores! Por ejemplo:

class MyCustomAdapterForClusters implements InfoWindowAdapter { @Override public View getInfoContents(Marker marker) { if (clickedCluster != null) { for (MarkerItem item : clickedCluster.getItems()) { // Extract data from each item in the cluster as needed } } // build your custom view // ... return view; } }