39 votes

Comment mettre à jour TileOverlay sans scintillement?

J'ai une certaine dynamique contenu de la vignette pour afficher sur une carte (en particulier, les images météo: radar, satellite, les températures, etc.). Je suis l'aide de l'API Google Maps pour Android v2.

Le problème, je vais avoir, c'est qu'apparemment, le seul moyen de mettre à jour la vignette des images (c'est à dire lorsque de nouvelles données arrivent, ou lorsque le cadre d'avances en un laps de temps d'animation) est d'appeler TileOverlay.clearImageCache. Malheureusement, quand je fais ça, la tuile de superposition scintille au loin pour un moment. C'est parce que clearImageCache supprime immédiatement les tuiles existante images de l'écran, mais il y a un délai avant de pouvoir décoder et d'afficher de nouveaux mosaïque d'images.

Je suis en utilisant une mesure TileProvider qui met en cache le carreau des images, plutôt que de chercher à partir du serveur à chaque fois. Mais même lorsqu'elle ne fait que nourrir les tuiles mises en cache (c'est à dire il n'y a pas de retard significatif imposées par mon TileProvider.getTile mise en œuvre), il y a encore assez d'un retard dans le processus que l'utilisateur peut voir un scintillement.

Personne ne sait d'une façon d'éviter ce scintillement? Est-il un moyen pour que je puisse le double tampon pour la tuile de superposition? J'ai essayé de double-tampon avec deux TileOverlays attaché à la carte, dont l'un est invisible. Mais l'invisible TileOverlay ne pas commencer l'extraction de tuiles de mon TileProvider -- même après que j'appelle clearImageCache.

1voto

Ice Phoenix Points 323

Serait-il possible de charger l'image de tuile à venir, mais la visibilité serait-elle fausse? Tile.setVisible(false);

Ensuite, lorsque vous souhaitez modifier (après le chargement de la tuile à venir), définir la tuile à venir pour être visible et la tuile actuelle pour être invisible?

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

De cette façon, le changement se produit dans le même cadre de rendu et il n'y a pas de délai d'attente pour le chargement des images en cache.

0voto

MaciejGórski Points 13551

Une assez bonne solution serait de séparer la tuile du téléchargement et de la mise en cache de TileProvider. De cette façon, vous pouvez contrôler quand ils sont téléchargés et ne remplacez byte[] références après le téléchargement de tous.

Cela pourrait être un peu plus complexe, parce que vous avez à prendre soin de l'actuelle région visible et le zoom de ne pas télécharger tous, mais seulement ceux qui seront visibles.

Modifier

Testé avec le code suivant:

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;
    }
}));

et quelque part plus tard:

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

"Le plus rapide" possible code ne fonctionne toujours pas.

Si vous ne pouvez pas passer GroundOverlay ou des Marqueurs, une autre idée est d'essayer d'utiliser un tiers des carreaux de la carte, votre météo actuelle carreaux au-dessus et à côté des tuiles ci-dessous, de sorte qu'ils peuvent charger et basculer entre eux (à l'aide de zOrder) après quelques secondes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X