Offseting le centre de la MapFragment pour une animation le déplacement de la cible lat/lng et le niveau de zoom

J'ai une INTERFACE utilisateur qui dispose d'un MapFragment avec une Vue transparente placée au-dessus d'elle. La carte reprend la totalité de l'écran, tandis que la Vue est juste le tiers gauche de l'écran. En conséquence, la valeur par défaut "centre" de la carte est éteint. Lorsque quelqu'un clique sur un marqueur, je veux de centre de marqueur dans la filiale zone visible de la MapFragment (pas le centre de la MapFragment lui-même).

Car c'est difficile à décrire avec des mots, permettez-moi de prendre quelques photos. Supposons que c'est la façon dont mon INTERFACE utilisateur semble:

Offseting le centre de la MapFragment pour une animation le déplacement de la cible lat/lng et le niveau de zoom

Lorsque l'utilisateur clique sur un marqueur, je veux à la fois le centre il et zoomer pour voir de plus près. Sans aucun réglage, c'est ce que vous obtiendrez:

Offseting le centre de la MapFragment pour une animation le déplacement de la cible lat/lng et le niveau de zoom

Ce que je veux, c'est pour le marqueur à être centré, mais dans l'espace à droite, comme ceci:

Offseting le centre de la MapFragment pour une animation le déplacement de la cible lat/lng et le niveau de zoom

Il est très facile à réaliser cet exploit si vous n'êtes pas changer le niveau de zoom à l'aide de la carte de projection:

//Offset the target latitude/longitude by preset x/y ints
LatLng target = new LatLng(latitude, longitude);
Projection projection = getMap().getProjection();
Point screenLocation = projection.toScreenLocation(target);
screenLocation.x += offsetX;
screenLocation.y += offsetY;
LatLng offsetTarget = projection.fromScreenLocation(screenLocation);

//Animate to the calculated lat/lng
getMap().animateCamera(CameraUpdateFactory.newLatLng(offsetTarget));

Toutefois, si vous décidez de changer le niveau de zoom dans le même temps, les calculs ci-dessus ne fonctionnent pas (depuis le lat/lng décalages de changement à différents niveaux de zoom).

Permettez-moi de lancer une liste de tentative de correctifs:

  • Changer le niveau de zoom rapidement, en faisant les calculs, le zoom arrière à l'original de la position de la caméra, puis l'animer. Malheureusement, le brusque changement de caméra (même si c'est seulement pour une fraction de seconde) est malheureusement très évident et je voudrais éviter le scintillement.

  • La superposition de deux MapFragments sur le dessus les uns des autres, d'en avoir un pour faire les calculs, tandis que l'autre affiche. J'ai trouvé que MapFragments ne sont pas vraiment construit pour être superposées les unes aux autres (il y a des inévitables bugs en bas de cette route).

  • La modification de l'emplacement d'un écran de x/y par la différence de niveau de zoom au carré. Théoriquement, cela devrait fonctionner, mais c'est toujours par un peu (~.1 latitude/longitude, ce qui est suffisant pour être loin).

Est-il un moyen de calculer la offsetTarget même avec le niveau de zoom en train de changer?

  • "depuis le lat/lng modifications requises à différents niveaux de zoom" -- qui n'a pas vraiment beaucoup de sens pour moi. Au-delà de ça, je ne suis pas certain pourquoi vous allez à travers tout l'écran de coordonner les choses. "Le tiers gauche" est "le tiers gauche" si vous mesurez en pixels, en degrés, en millimètres, de parsecs, ou quoi que ce soit. Permettrait de garder tous vos calculs en termes de latitude et de longitude de l'aide?
  • J'ai pensé que ce serait difficile à expliquer avec de simples mots; permettez-moi de tenter de dresser une image qui éclaire le problème.
  • Là, même question mais avec des aides visuelles. Le problème avec l'aide de tous latitude/longitude pour les calculs, c'est que le décalage je désir est purement mesurée en pixels (basé sur la taille de l'écran et la façon dont beaucoup de la MapFragment est visible).
  • "le décalage je désir est purement mesurée en pixels" -- alors, quand vous avez écrit "la Vue est juste le tiers gauche de l'écran", ce n'était pas une déclaration exacte? Parce que, si elle est exacte, les pixels ne sont pas pertinents, comme un tiers, un tiers, un tiers, indépendamment des unités de mesure.
  • Les pixels qui constituent 1/3ème de l'écran change en fonction la taille de l'écran. L'appareil changements nécessitent une cible LatLng, donc je dois être capable de tout convertir/de LatLng. Essentiellement, je suis en train de convertir les pixels sur l'écran à un décalage en latitude/longitude. Que lat/lng compenser les variations selon le niveau de zoom, depuis plus de zoom, plus les degrés de changement, vous devez déplacer autour de la carte.
  • En outre, je suis en simplifiant le problème un peu pour des raisons de concision. La Vue sur la gauche n'est pas 1/3ème, c'est en fait un ensemble de largeur qui varie selon la min-largeur de la tablette. En outre, je tiens aussi à décaler verticalement (car je veux montrer certains de l'information interactive au-dessus du marqueur ainsi, dans une fenêtre contextuelle).
  • Ah! OK, je comprends maintenant pourquoi vous avez besoin de pixels. Malheureusement, je n'ai pas de solution pour vous. 🙁
  • vous l'avez résolu ? J'ai le même problème!

InformationsquelleAutor Daniel Lew | 2013-03-25