studio polyutil libreria library groundoverlay google example android google-maps-android-api-2

android - polyutil - ¿Cómo actualizar TileOverlay sin parpadeo?



import com google maps android polyutil (2)

Tengo un contenido de mosaico dinámico para mostrar en la parte superior de un mapa (específicamente, imágenes del clima: radar, satélite, temperaturas, etc.). Estoy usando Google Maps API para Android v2.

El problema que tengo es que aparentemente la única forma de actualizar las imágenes de mosaico (es decir, cuando llegan nuevos datos, o cuando el cuadro avanza en una animación de lapso de tiempo) es llamar a TileOverlay.clearImageCache. Lamentablemente, cuando lo hago, la superposición de mosaicos se apaga por un momento. Esto se debe a que clearImageCache elimina inmediatamente las imágenes de mosaico existentes de la pantalla, pero hay un retraso antes de que pueda decodificar y mostrar nuevas imágenes de mosaico.

Estoy usando un TileProvider personalizado que almacena en caché las imágenes de mosaico, en lugar de buscarlas en el servidor cada vez. Pero incluso cuando solo está alimentando las teselas en caché (es decir, no hay una demora significativa impuesta por la implementación de TileProvider.getTile), todavía hay una demora suficiente en el proceso como para que el usuario pueda ver un parpadeo.

¿Alguien sabe de una forma de evitar este parpadeo? ¿Hay alguna forma en que pueda duplicar la superposición de mosaicos? Traté de duplicarlo con dos TileOverlays adjuntas al mapa, una de las cuales es invisible. Pero el TileOverlay invisible no comienza a recuperar ninguna tesela de mi TileProvider, incluso después de llamar a clearImageCache.


Una solución bastante buena sería separar la descarga de mosaicos y el almacenamiento en caché de TileProvider. De esta forma, puede controlar completamente cuándo se descargan y solo reemplazar las referencias de bytes [] después de descargar todo.

Esto podría ser un poco más complejo, porque debe cuidar la región visible actual y hacer zoom para no descargarlas todas, sino solo aquellas que serán visibles.

Editar

Probado con el siguiente código:

try { InputStream is = getAssets().open("tile1.jpg"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int b = is.read(); while (b != -1) { baos.write(b); b = is.read(); } byte[] array = baos.toByteArray(); cache = new Tile(256, 256, array); is = getAssets().open("tile2.jpg"); baos = new ByteArrayOutputStream(); b = is.read(); while (b != -1) { baos.write(b); b = is.read(); } array = baos.toByteArray(); nextCache = new Tile(256, 256, array); } catch (IOException ex) { Log.e("tag", "error reading tiles", ex); } tileOverlay = map.addTileOverlay(new TileOverlayOptions().tileProvider(new TileProvider() { @Override public Tile getTile(int x, int y, int zoom) { return cache; } }));

y en algún lugar posterior:

Tile temp = cache; cache = nextCache; nextCache = temp; tileOverlay.clearTileCache();

El código posible "más rápido" aún falla.

Si no puedes cambiar a GroundOverlay o Markers, otra idea es tratar de usar mosaicos de mapas de terceros, tus fichas de clima actuales arriba y las siguientes fichas debajo, para que puedan cargarlas y cambiarlas (usando zOrder) después de unos segundos.


¿Sería posible cargar la próxima imagen de mosaico sin embargo, tener la visibilidad establecida en falso? Tile.setVisible(false);

Luego, cuando quieras cambiar (después de que se haya cargado la siguiente ficha), configura la próxima ficha para que sea visible y la ficha actual sea invisible.

CurrentTile.setVisible(false); NewTile.setVisible(true);

De esta forma, el cambio ocurre dentro del mismo fotograma de renderizado, y no hay demora esperando a que se carguen las imágenes en caché.