2010-05-07 4 views
12

Estoy tratando de dibujar una ruta en mi MapView. He extendido Overlay e implementado el método draw(). La ruta se muestra correctamente, aunque durante la depuración, agregué un punto de interrupción en draw(), y noté que se llama constantemente.dibujar se está llamando constantemente en mi superposición de mapa de Android

Solo quiero que se vuelva a dibujar si alguien mueve el mapa o hace un acercamiento (el sorteo tiene en cuenta estos cambios al dibujar la ruta) ¿Qué puede causar esto?

Respuesta

13

Hay dos métodos de dibujo que se pueden sustituir.

void draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow) 

Desc: Dibuja la plantilla sobre el mapa.

boolean draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow, long when)
Desc: Draw call for animation overlays.

Originalmente anulé el segundo.
Después de cambiar al primer método, funcionó.

2

Creo que el método de dibujo se llama en varias ocasiones porque el fondo se vuelve a dibujar constantemente. intente configurar el "MapView.ReticleDrawMode" en DRAW_RETICLE_UNDER. Esto básicamente le dice al mapView que dibuje la retícula debajo de las superposiciones. Por lo tanto, el método de sorteo de superposición no se ejecutará cuando se recupere el fondo. esto solucionó el problema para mí.

para obtener más información, mira aquí: MapView Api

2

Me tropecé cuando no me di cuenta de que el método de dibujar no solo llamaba a los marcadores que dibujabas, sino también a la sombra de esos marcadores. Entonces, como ejemplo, si tiene dos marcadores y tiene las sombras configuradas en verdadero (que es la configuración predeterminada), entonces tendrá que llamar al método de sorteo 4 veces (una para cada marcador, una para cada sombra de los marcadores))!

-1

Simplemente puede agregar esto a su clase ItemizedOverlay:

@Override public void draw(Canvas c, MapView m, boolean shadow) { super.draw(c, m, false);} 

Esto va a eliminar la sombra de la superposición MapView.

1

Para mí, parece un error extraño: a veces el método de dibujo se llama continuamente, a veces no.

ver here.

2

Después de una revisión adicional, el sorteo de superposición() realmente funciona como se describe en la documentación. Un sorteo para shadow = true y otro para shadow = false.

Lo interesante es que el método específico de superposición draw() responde como se anuncia para cada elemento dibujado en MapView. Por ejemplo, en mi caso, parece responder por cada uno el mapa de Google, el logotipo de Google dibujado en el mapa y luego la superposición particular que he dibujado yo mismo. Obviamente, dos veces para cada uno (sombra verdadera | falsa).

Esta es probablemente la forma prevista para representar los mapas. No he encontrado o no he pasado suficiente tiempo investigando para obtener esta información.

Además, en mi caso, tengo un panel transparente renderizado sobre mi mapa con CheckBox (s) y widgets TextView.El TextView obliga al método draw() a ejecutarse sin interrupción ya que la vista de texto siempre está a la escucha de la entrada y, por lo tanto, desencadena el redibujado de la superposición.

1

En mi aplicación, tengo una barra de progreso indefinido (por ejemplo, el círculo de giro) espectáculo cuando estoy cargando datos de la red para ver el mapa. Cuando los datos de la red terminaron de cargarse, estaba configurando la visibilidad de la barra de progreso como invisible. Sin embargo, esto causó que el mapa se redibujara continuamente, ya que parece que cualquier animación (supongo) que tiene lugar sobre el mapa hará que el mapa se vuelva a dibujar. La solución simple a esto es establecer la visibilidad en lugar de ir. P.ej. cambiar esta situación:

ProgressBar loadingIcon = (ProgressBar) findViewById(R.id.loadingIcon); 
... 
//Network data now finished loading... 
loadingIcon.setVisibility(View.INVISIBLE); 

a esto:

loadingIcon.setVisibility(View.GONE); 

que elimina por completo del mapa, ya no se anima sobre ella y por lo tanto no causa draw() para ser llamado un tiempo indefinido.

+0

Muchas gracias por publicar esto - sólo resuelven un problema que me estaba volviendo loco. –

0

Sé que este es un problema antiguo, pero sólo ahora se encuentran con él. Esta es una publicación "por lo que vale".

El bucle de tracción resultó ser un error de codificación de mi parte. De acuerdo con el documento, si la rutina de dibujo devuelve verdadero, está solicitando una actualización inmediata. Si se devuelve falso, solo se realizan dos pasadas para cada superposición; uno para la sombra verdadera y uno para la sombra falsa. Estaba volviendo cierto, lo que resultó en una actualización constante. Después de cambiar a regresar falso, solo ocurrieron dos pases por superposición. Sin bucle

Cuestiones relacionadas