Android Maps API v2 con marcadores personalizados

Quiero hacer mapas con marcadores personalizados. En API v2 puedo configurar el icono, título, etc para los marcadores. Pero quiero mostrar el título con el marcador en el primer inicio. Ahora el título sólo aparece cuando grabo el marcador. En v1 se superponían, pero en v2 no encontré nada similar.

Editado: Tal vez no estaba lo suficientemente claro. Algo como Marker.showInfoWindow() en API funciona sólo 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 toque en él.

También he tropezado con este problema. V2 API es un paso adelante, dos pasos atrás. Google, agrega un método de "draw" que se puede sobreescribir en las clases Marcador o GoogleMap para que podamos personalizar el dibujo nosotros mismos.

Una posible solución es generar el mapa de bits sobre la marcha y adjuntarlo al marcador. Crear un lienzo, insertar el mapa de bits de marcador, dibujar el texto junto al marcador. Esto implica algunos cálculos dolorosos (el tamaño apropiado del lienzo con el mapa de bits del marcador y el texto al lado del otro). Desafortunadamente, no hay un método setIcon en Marker, así que cada vez que cambia el texto, se debe crear un nuevo marcador. Puede ser muy bien si sólo tiene un marcador en el mapa, pero con decenas 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 ejemplo (con sólo 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) ); 

Esperemos que Google agregará los métodos apropiados para que podamos hacerlo fácilmente. Maldita sea, me gusta mucho la nueva función de rotación de mapas en V2 API.

Finalmente lo hizo. Así que lo que haces es tener una imagen de fondo (en mi caso sólo uso un rectángulo azul). Cree un marcador así:

 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: Añadir texto a la imagen en android mediante programación

Parece que tu pregunta se contestó finalmente en una sesión de E / S de Google.

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

Tiene:

Marcado de clústeres – maneja la visualización de un gran número de puntos

Mapas de calor – mostrar un gran número de puntos como un mapa de calor

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

Marcadores realizados con la biblioteca

Muy importante, puede ser modificado en cualquier hilo para manejar muchos marcadores es una brisa

No estoy seguro de qué intenta lograr: tener la ventana de información mostrada sin que el usuario tenga que tocar en el marcador o usar una vista completamente diferente para la ventana de información (o quizás ambas).

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

No he probado esto yo mismo, pero estoy adivinando Marker.showInfoWindow () haría el truco (suponiendo que la visibilidad del marcador ya es true .

Para proporcionar una vista personalizada para el InfoWindow

Hay dos opciones aquí y debe consultar la documentación en GoogleMap.InfoWindowAdapter :

Interfaz estática pública GoogleMap.InfoWindowAdapter

Proporciona vistas para la renderización personalizada de ventanas de información.

Métodos en este proveedor se llaman cuando es el momento de mostrar una ventana de información para un marcador, independientemente de la causa (ya sea un gesto del usuario o una llamada programática a showInfoWindow (). Puesto que sólo se muestra una ventana de información en cualquier momento, Este proveedor puede optar por reutilizar vistas o puede optar por crear nuevas vistas en cada invocación de método.

Cuando se construye 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 (Marcador) con su interpretación personalizada. Para reemplazar sólo el contenido de la ventana de información, dentro del marco de ventana de información por defecto (la burbuja de llamada), deje la implementación predeterminada de getInfoWindow (Marcador) en su lugar y reemplace getInfoContents (Marcador) en su lugar.

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

Una advertencia: Creo que al anular estos métodos, realiza una representación simple de lo que se ve la vista en el momento en que getInfoWindow() o getInfoContents() se llama. Yo mismo estoy interesado en tratar de replicar la apariencia de la aplicación nativa de Google Maps para Android que tiene un pequeño icono de "direcciones" junto al nombre del lugar. Uno de los problemas que creo (ver aquí: https://stackoverflow.com/a/13713536/129475 ) es que si tienes algo como un botón en tu vista, puede no comportarse como un botón debido a la representación estática.

Personalizar la imagen del marcador

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

FromAsset (String assetName) Crea un marcador personalizado utilizando una imagen en el directorio assets.

FromBitmap (Imagen de mapa de bits) Crea un marcador personalizado de una imagen de mapa de bits.

FromFile (String path) Crea un icono personalizado desde un archivo en la ruta de acceso especificada.

FromResource (int resourceId) Crea un marcador personalizado utilizando un recurso existente. El siguiente fragmento crea un marcador con un icono 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, a continuación, cuando se trata de laoding los marcadores, iterar a través de ellos llamando showInfoWindow() . No puede ser la solución más elegante, pero hace lo que está diciendo, creo.

He resuelto 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.

Utilicé Photoshop y marcadores 53x110px.

Un ejemplo de marcador que hice

  • Añadir ronda egde a un marcador de mapa
  • Cómo cargar marcadores dinámicamente para la posición actual en google-maps de Android?
  • Comportamiento incorrecto con zoom en Google Maps de Android
  • MyLocation botón oculto tras la barra de acción transparente, cómo reposicionar?
  • Android Maps: No se pudo cargar el mapa. No se pudo contactar con los servidores de Google
  • Google Maps Android API v2 sólo admite dispositivos con OpenGL ES 2.0 y superior
  • Error en el comando Keytool
  • Agregar API de Google al proyecto existente de eclipse
  • Reemplazar getMap con getMapAsync
  • Obtener la ubicación seleccionada de la actividad de Google Maps
  • ¿Existe una funcionalidad como el método onFirstFix en el Android Maps Api V2?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.