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?
- Comportamiento extraño en el navegador de Android al seleccionar campos
- ¿Cómo puedo poner una vista encima de un glSurfaceView con un fondo transparente?
- Cómo crear una superposición de información en Android
- Cómo dibujar polígono mano libre en Google mapa V2 en Android?
- Animación superpuesta a una actividad de la cámara
- Especifique Layout Margen superior para la barra de acción de superposición
- Custom OverlayItem sin dibujar
- ¿Cómo crear una superposición que bloquea los eventos de toque a la interfaz de usuario debajo de él?
- Color de relieve de superposición de círculo no dibujado siempre en Google Maps v2
- Superponer una actividad en otra actividad O superponer una vista sobre otra
- ¿Cómo mostrar una ruta entre dos geocoords en google maps?
- Uso de ItemizedOverlay y OverlayItem en Android Beta 0.9
- Widget flotante / superposición en el lanzador de Android
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.
- Apk sólo se ejecuta en modo de depuración. Apk comenzó con "Ejecutar" en Eclipse se detiene en puntos de interrupción
- Instalar imágenes de sistema antiguas de Android (ABI) desde la línea de comandos