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;
}
}