Android Maps API v2 con marcadores personalizados

Quiero hacer mapas con marcadores personalizados. En API v2 puedo establecer el icono, el título, etc. para los marcadores. Pero quiero mostrar el título con marcador en el primer inicio. Ahora el título se muestra solo cuando grabo el marcador. En v1 había superposiciones, pero en v2 no encontré nada similar.

Editado: Tal vez no fui lo suficientemente claro. Algo como Marker.showInfoWindow() en API funciona solo para un marcador. No puedo mostrar ventanas de información para todos mis marcadores al mismo tiempo. De todos modos, necesito mostrar títulos para todos mis marcadores, sin esperar mientras el usuario lo toque.

También me encontré con este problema. La API V2 es un paso adelante, dos pasos atrás. Google, agregue un método de ‘sorteo’ sobresaturado en las clases de Marker o GoogleMap para que podamos personalizar el dibujo nosotros mismos.

Una posible solución es generar el bitmap sobre la marcha y adjuntarlo al marcador. es decir, crear un canvas, insertar el bitmap del marcador, dibujar el texto junto al marcador. Esto implica algunos cálculos dolorosos (el tamaño de canvas apropiado con el bitmap del marcador y el texto al lado del otro). Desafortunadamente, no hay un método setIcon en Marker, por lo que cada vez que el texto cambia, se debe crear un nuevo marcador. Puede estar bien si solo tiene un marcador en el mapa, pero con docenas de marcadores, esto puede no ser factible. También puede haber problemas de memoria al crear esos mapas de bits dinámicamente. Un código de muestra (con solo el texto):

 Bitmap.Config conf = Bitmap.Config.ARGB_8888; Bitmap bmp = Bitmap.createBitmap(200, 50, conf); Canvas canvas = new Canvas(bmp); canvas.drawText("TEXT", 0, 50, paint); // paint defines the text color, stroke width, size mMap.addMarker(new MarkerOptions() .position(clickedPosition) //.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker2)) .icon(BitmapDescriptorFactory.fromBitmap(bmp)) .anchor(0.5f, 1) ); 

Con suerte, Google agregará los métodos apropiados para que podamos hacer esto fácilmente. Maldita sea, realmente me gusta la nueva función de rotación de mapas en la API V2.

Finalmente lo hizo. Entonces, lo que haces es tener una imagen de fondo (en mi caso solo uso un rectángulo azul). Crea un marcador como ese:

 Marker myLocMarker = map.addMarker(new MarkerOptions() .position(myLocation) .icon(BitmapDescriptorFactory.fromBitmap(writeTextOnDrawable(R.drawable.bluebox, "your text goes here")))); 

Observe el método writeTextOnDrawable ():

 private Bitmap writeTextOnDrawable(int drawableId, String text) { Bitmap bm = BitmapFactory.decodeResource(getResources(), drawableId) .copy(Bitmap.Config.ARGB_8888, true); Typeface tf = Typeface.create("Helvetica", Typeface.BOLD); Paint paint = new Paint(); paint.setStyle(Style.FILL); paint.setColor(Color.WHITE); paint.setTypeface(tf); paint.setTextAlign(Align.CENTER); paint.setTextSize(convertToPixels(context, 11)); Rect textRect = new Rect(); paint.getTextBounds(text, 0, text.length(), textRect); Canvas canvas = new Canvas(bm); //If the text is bigger than the canvas , reduce the font size if(textRect.width() >= (canvas.getWidth() - 4)) //the padding on either sides is considered as 4, so as to appropriately fit in the text paint.setTextSize(convertToPixels(context, 7)); //Scaling needs to be used for different dpi's //Calculate the positions int xPos = (canvas.getWidth() / 2) - 2; //-2 is for regulating the x position offset //"- ((paint.descent() + paint.ascent()) / 2)" is the distance from the baseline to the center. int yPos = (int) ((canvas.getHeight() / 2) - ((paint.descent() + paint.ascent()) / 2)) ; canvas.drawText(text, xPos, yPos, paint); return bm; } public static int convertToPixels(Context context, int nDP) { final float conversionScale = context.getResources().getDisplayMetrics().density; return (int) ((nDP * conversionScale) + 0.5f) ; } 

Gracias a Arun George: agregue texto a la imagen en Android programáticamente

Parece que su pregunta finalmente fue respondida en una sesión de Google I / O.

Eche un vistazo a http://googlemaps.github.io/android-maps-utils/

Tiene:

Agrupación de marcadores: maneja la visualización de una gran cantidad de puntos

Mapas de calor: muestra una gran cantidad de puntos como un mapa de calor

IconGenerator: muestra texto en tus marcadores (ver captura de pantalla)

Marcadores hechos usando la biblioteca

Muy importante, se puede modificar en cualquier hilo, por lo que manejar muchos marcadores es muy sencillo

No estoy seguro de lo que está tratando de lograr: tener la ventana de información aparece sin que el usuario tenga que tocar el marcador, o usar una vista completamente diferente para la ventana de información (o tal vez ambas).

Para mostrar la ventana de información sin requerir un usuario, toque:

No lo he probado yo mismo, pero supongo que Marker.showInfoWindow () haría el truco (suponiendo que la visibilidad del Marker ya sea true .

Para proporcionar una vista personalizada para la ventana de información

Aquí hay dos opciones y debe consultar la documentación en GoogleMap.InfoWindowAdapter :

interfaz estática pública GoogleMap.InfoWindowAdapter

Ofrece vistas para la representación personalizada de ventanas de información.

Los métodos de este proveedor se llaman cuando es hora de mostrar una ventana de información para un marcador, independientemente de la causa (ya sea un gesto de usuario o una llamada programática a showInfoWindow (). Como solo se muestra una ventana de información al mismo tiempo, este proveedor puede optar por reutilizar vistas, o puede optar por crear nuevas vistas en cada invocación de método.

Al construir una ventana de información, los métodos de esta clase se llaman en un orden definido. Para reemplazar la ventana de información predeterminada, anule getInfoWindow (Marker) con su representación personalizada. Para reemplazar solo el contenido de la ventana de información, dentro del marco predeterminado de la ventana de información (la burbuja de llamada), deje la implementación predeterminada de getInfoWindow (Marker) en su lugar y anule getInfoContents (Marker) en su lugar.

Básicamente, si reemplaza getInfoWindow() o getInfoContents() dependerá de si desea personalizar o no lo que ve dentro de la burbuja de llamada, o si desea personalizar toda la ventana de información, incluida una alternativa a la burbuja de llamada .

Una advertencia: creo que cuando anula estos métodos, realiza una representación simple de cómo se ve la vista en el momento en que se getInfoWindow() o getInfoContents() . Yo mismo estoy interesado en tratar de reproducir el aspecto de la aplicación nativa de Google Maps para Android que tiene un pequeño ícono de “direcciones” al lado del nombre del lugar. Uno de los problemas que creo (consulte aquí: https://stackoverflow.com/a/13713536/129475 ) es que si tiene algo parecido a un botón en su vista, es posible que no se comporte como un botón debido a la representación estática.

Personaliza la imagen del marcador

Puede reemplazar la imagen de marcador predeterminada con una imagen de marcador personalizada, a menudo llamada icono. Los icons personalizados siempre se configuran como un BitmapDescriptor y se definen utilizando uno de los cuatro métodos en la clase BitmapDescriptorFactory.

fromAsset (String assetName) Crea un marcador personalizado usando una imagen en el directorio de activos.

fromBitmap (Imagen de bitmap) Crea un marcador personalizado a partir de una imagen de bitmap.

fromFile (String path) Crea un icono personalizado desde un archivo en la ruta especificada.

fromResource (int resourceId) Crea un marcador personalizado utilizando un recurso existente. El fragmento a continuación crea un marcador con un ícono personalizado.

  private static final LatLng MELBOURNE = new LatLng(-37.813, 144.962); private Marker melbourne = mMap.addMarker(new MarkerOptions() .position(MELBOURNE) .title("Melbourne") .snippet("Population: 4,137,400") .icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow))); 

Este código simple funciona para mostrar el título sin requerir un evento de clic:

 googleMap.addMarker(new MarkerOptions() .position(latLng) .title(String title)) .showInfoWindow(); 

¿Por qué no mantener una matriz de los marcadores cuando se trata de lanzar los marcadores, iterar a través de ellos llamando a showInfoWindow() . Puede que no sea la solución más elegante, pero hace lo que dices, creo.

Resolví este problema haciendo mis propios marcadores con un editor de imágenes que tiene los detalles a continuación. Tomó algún tiempo para hacer, pero funciona.

Usé marcadores de Photoshop y 53x110px.

un marcador de ejemplo que hice