2010-08-13 4 views
1

J'ai un problème étrange que je ne sais pas vraiment comment attaquer donc je me demande si quelqu'un a déjà eu un problème similaire auparavant.ItemizedOverlay semble dessiner avec une projection "cassée"

Je remplace la méthode dessiner (Canvas canvas, MapView mapView, shadow booléen) dans une sous-classe ItemizedOverlay pour dessiner des chemins, du texte, etc. entre les éléments. La première chose que je fais dans le remplacement est d'appeler super.draw avec tous ces paramètres. Quand je démarre l'application, les lignes que je dessine dans mon override sont où elles sont censées être, mais les OverlayItems réels que dessine super.draw sont loin. Ce qui est intéressant, c'est que lorsque je déplace la carte vers le coin supérieur gauche (coords 0,0), les OverlayItems se rapprochent de l'endroit où je les attend (en fait, ils semblent parfaitement correspondre quand je reçois le premier point à point (0,0)). Lorsque je déplace la carte pour que les OverlayItems s'éloignent du point (0,0), ils s'éloignent linéairement de leur géolocalisation.

Dans le cas où personne n'a déjà fait face à ce problème et ce n'est pas quelque chose d'évident, je vais essayer de faire un exemple minimal qui a encore ce comportement et le poster ici. Le code réel est relativement grand, donc je voudrais éviter beaucoup de travail si quelqu'un a une idée de ce qui pourrait être le problème.

modifier: une information supplémentaire qui pourrait être utile ... ma méthode de tirage ressemble à ceci:

public void draw(Canvas canvas, MapView mapView, boolean shadow) { 
    super.draw(canvas, mapView, shadow); 
    if (!shadow) { 
     // code for drawing the lines etc. 
     // on the canvas (uses mapView.getProjection()) 
    } 
} 

La partie personnalisée de la superposition ne dispose pas d'une couche d'ombre (je l'ai utilisé la même logique lors de l'extension Overlay sans problème). La couche d'ombre qui est dessinée pour les OverlayItems par super.draw est en fait à mi-chemin entre le Drawable et la géolocalisation attendue pour chaque élément particulier.

Voici des captures d'écran de l'avd pour mieux illustrer ce qui se passe. Les quatre broches rouges devraient être sur la ligne rouge au-dessus d'eux et se déplacer vers la ligne que je glisse la carte vers le haut à gauche. Les deux broches et la ligne entre elles sont dessinées dans ma commande personnalisée, super.draw dessine les quatre ombres et les quatre broches rouges supplémentaires.

Puisqu'il s'agit de mon premier article et que je ne peux pas publier plus d'un lien, j'ai placé les trois captures d'écran sur le même fichier jpg.
screenshot

Répondre

0

Il est difficile de diagnostiquer sans regarder le code. Je vérifierais quelques choses, cependant:

  1. Utilisez-vous la projection de MapView? Vous assurez-vous d'en récupérer un nouveau chaque fois que draw() est appelé?

  2. Avez-vous veillé à une méthode liée pour vos Drawables? par exemple, boundCenter() ou boundCenterBottom()

+0

1. Oui, j'appelle mapView.getProjection() comme l'une des premières choses dans la méthode draw et j'utilise l'objet retourné pour la durée de cette méthode draw - cependant, je ne pense même pas que je n'utilise pas la précision la projection pour ma substitution de tirage causerait ce problème puisque le résultat de l'appel super.draw est ce qui me donne des résultats inattendus. 2. oui, j'utilise le même dessin par défaut pour tous les OverlayItems et je le mets dans le constructeur via super (boundCenterBottom (defaultMarker)) –

0

J'ai résolu ce problème et je pense que l'idée que je me suis peut-être utile à d'autres, donc je vais expliquer ce qui est arrivé ici. Je ne suis pas sûr s'il est approprié de répondre à ma propre question - sinon, s'il vous plaît indiquez-moi où je devrais mettre ce texte et je vais modifier/supprimer en conséquence. Le problème résidait dans mon incompréhension de la façon fondamentale de dessiner les tiroirs. Ce malentendu est né de la lecture de JavaDoc for Drawable.dessiner qui dit:

dessiner dans ses limites (fixé via setBounds) concernant les effets éventuels tels que alpha (fixé via setAlpha) et la couleur filtre (fixé via setColorFilter).

Depuis que j'avais à l'origine d'une sous-classe de superposition dessiner le chemin que vous pouvez voir sur la capture d'écran et ItemizedOverlay décidé d'utiliser pour les marqueurs le long de ce chemin (de sorte qu'ils soient facilement tappable etc.) je me mets à modifier légèrement mon classe. À un certain point, pour voir si les choses fonctionnaient comme je l'avais prévu, j'ai ajouté quelques éléments et utilisé le même Drawable que pour l'un des points de terminaison de chemin. Guidé par la JavaDoc pour la méthode de tirage au sort, je quelque chose comme ça pour dessiner le chemin Endpoints

private void drawMarker(Canvas canvas, Projection projection, 
    GeoPoint location, Drawable drawable) { 
    Point point = projection.toPixels(location, null); 
    drawable.setBounds(
     point.x, 
     point.y - drawable.getIntrinsicHeight(), 
     point.x + drawable.getIntrinsicWidth(), 
     point.y); 
    drawable.draw(canvas); 
} 

Cependant, quand je traçais à travers l'appel super.draw, je remarquais qu'il a fini par appeler Drawable.draw mais le drawable a toujours eu les mêmes limites - celles que j'ai définies avec l'appel précédent à cette méthode drawMarker. Je ne comprends toujours pas comment Drawable.draw sait où placer le Drawable, mais à ce moment-là, le comportement que j'ai décrit dans la question était assez évident. En rétrospective, je devrais probablement avoir réalisé que boundCenter et boundCenterBottom définissent réellement les limites sur un Drawable (ce que dit leur JavaDoc), mais à la place, je suppose que je pensais que ça changeait juste la façon dont les limites sont déterminées "finalement", quand le le point réel que vous voulez dessiner est connu.

En tout cas, j'ai ajouté un peu de fonctionnalité supplémentaire pour utiliser les tirages que je voulais utiliser pour les OverlayItems et bien sûr, cela fonctionne parfaitement. Je me demande toujours si ce que je fais dans drawMarker est la façon dont il est censé être fait, mais je ne connais pas d'autre moyen de dire à la toile où placer le Drawable.

Questions connexes