Dibujo es constantemente llamado en mi superposición de mapa de Android

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

Sólo quiero que se vuelva a dibujar si alguien mueve el mapa o zooms (el sorteo tener en cuenta estos cambios al dibujar la ruta) ¿Qué puede causar esto?

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

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

Desc: Dibuja la superposición sobre el mapa.

boolean draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow, long when)
Desc: Dibuja una llamada para superposiciones animadas.

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

Creo que el método de dibujo se llama repetidamente porque el del fondo que se redibuja constantemente. Intente establecer el "MapView.ReticleDrawMode" en DRAW_RETICLE_UNDER. Esto básicamente le dice al mapView que dibuje el retículo debajo de las superposiciones. Por lo tanto, el método de dibujo de superposición no se llamará cuando se recuerda el fondo. Esto arregló el problema para mí.

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

Me tropecé cuando no me di cuenta de que el método de dibujo se llama no sólo los marcadores que dibuja, sino también la sombra de los marcadores. Por ejemplo, si tiene dos marcadores y tiene sombras configuradas en true (que es el valor predeterminado), entonces tendrá el método draw llamado 4 veces (una vez para cada marcador, una vez para cada sombra de los marcadores )!

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

Lo interesante es que el método draw () de superposición específica responde como se anuncia para cada elemento dibujado en el MapView. Por ejemplo, en mi caso, parece responder por cada uno de los mapas google, el logotipo de Google dibujado en el mapa, y luego la superposición particular que he dibujado a mí mismo. Obviamente dos veces para cada uno (shadow true | false).

Esta es probablemente la forma prevista para procesar los mapas. No he encontrado o pasado bastante tiempo que investiga para esta información.

Además, en mi propio caso, tengo un panel transparente representado sobre mi mapa con CheckBox (s) y widgets TextView. TextView obliga al método draw () a ejecutar sin parar ya que la vista de texto siempre está escuchando la entrada y, por lo tanto, desencadena el redibujo de la superposición.

En mi aplicación, tengo una barra de progreso indefinida (por ejemplo, un círculo giratorio) cuando carga los datos de la red para el mapa. Cuando los datos de red se terminó de cargar, estaba poniendo la visibilidad de la barra de progreso a invisible. Sin embargo, esto hizo que el mapa continuamente se vuelva a dibujar, ya que parece que cualquier animación (supongo) que tiene lugar sobre el mapa hará que el propio mapa vuelva a dibujar. La solución simple a esto es fijar la visibilidad a ido en lugar de otro. Por ejemplo, cambie esto:

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

a esto:

 loadingIcon.setVisibility(View.GONE); 

Que lo elimina completamente del mapa, ya no se anima sobre él y por lo tanto no hace que draw () sea llamado indefinidamente.

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

Ver aquí .

Sé que este es un viejo problema, pero ahora lo he encontrado. Este es un mensaje "por lo que vale la pena".

El bucle de dibujo resultó ser un error de codificación de mi parte. De acuerdo con el documento, si la rutina de dibujo devuelve verdadero, se pide una actualización inmediata. Si se devuelve false, sólo se realizan dos pasadas para cada superposición; Una para la sombra verdadera y otra para la sombra falsa. Me estaba devolviendo verdad que resultó en una actualización constante. Después de cambiar a devolver falso, sólo dos pases por superposición ocurrieron. No hay bucle.

Simplemente puede agregar esto a su clase ItemizedOverlay:

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

Esto eliminará la sombra de la superposición de mapa.

  • Mi superposición no aparece hasta que se pulse mapView en android
  • Dibuja una ruta en los mapas siguiendo la ruta de movimiento de los dedos en la pantalla del dispositivo
  • Aplicación de Android: mostrar elementos de superposición en AsyncTask
  • Entender boundCenterBottom ()
  • Android: trazado de dibujo como superposición en MapView
  • Android: ItemizedOverlay onTouchEvent y onTap se superponen
  • ¿Cómo puedo dibujar una flecha que muestre la dirección de manejo en MapView?
  • ICS teclado de vuelta, los botones de inicio no tomar contacto cuando se abre en la superposición
  • Agregar Overlay a un MapView en osmdroid
  • Barra de herramientas Android superpuesta TabLayout en CollapsingToolbarLayout
  • ¿Por qué mi sistema se superpone capturando todos los toques (no es posible interacción con la vista subyacente)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.