10
votes

Comment attraper cette carte Panning et zoom sont vraiment terminés?

J'essaie d'écrire une application qui chargera de manière dynamique des données pour mapper pendant que des casseroles d'utilisateur ou le zoomez.

J'ai besoin de suivre lorsque la carte est terminée de changer d'état d'affichage (arrête le panoramique ou le zoom), puis chargez une nouvelle partie des données pour créer des marqueurs. Mais en fait, Google Maps API n'a aucun événement pour gérer cela.

Il existe des méthodes telles que la création d'une superposition vide pour contrôler les événements AOUTOTOUCH et ainsi de suite, mais le panorige de la carte pourrait durer longtemps après la fin de l'utilisateur, car gmaps utilise une sorte d'inertie pour faire la poêle .

J'ai essayé de sous-classe mapviev mais son draw () méthode est final il ne peut donc pas être remplacé.

Des idées comment faire une manipulation précise de la finition de la poêle et du zoom?


0 commentaires

3 Réponses :


12
votes

Heures de recherche et une décision a été trouvée. Il a des inconvénients et des pros que je vais décrire plus loin.

La principale chose que nous devrions faire est de remplacer certaines méthodes de MapView pour gérer son comportement de dessin. Si nous ne pouvions pas remplacer la méthode de dessin (), nous devrions trouver une autre manière. Il existe un autre dérivé de la vue qui peut être remplacé - méthode ComputesCroll (). Il s'appelle à plusieurs reprises lorsque la carte continue de remplir. Tout ce que nous avons à faire est de définir un seuil de temps pour attraper si Computescroll n'est plus appelé cette fois.
Voici ce que j'ai fait: xxx

puis vous devez enregistrer les gestionnaires d'événements dans votre mapactivité comme ceci: xxx

À propos des avantages et des inconvénients de cette approche?
Avantages:
- Les événements gèrent la carte de l'autre manière ont été harcelés ou zoomés. Événement tactile, les touches matérielles utilisées, même les événements tirés de manière programmatique sont manipulés (comme Setzoom () ou Animate () Méthodes).
- Possibilité de sauter une charge inutile des données si l'utilisateur clique sur le bouton ZOOM plusieurs fois rapidement. L'événement tirera seulement après que des clics s'arrêtent.
Inconvénients:
- Il n'est pas tout à fait possible d'annuler le zoom ou l'action panoramique (peut-être que je vais ajouter cette capacité à l'avenir)

J'espère que cette petite classe vous aidera.


4 commentaires

Un autre petit problème que j'ai remarqué lors de l'utilisation de cette solution, est-ce que la modification de la modification de l'un de mes SubayItem S ou Modifier la rotation, ComputerScroll () serait également déclenchée, rendant le Onpanchangelistener Feu.


Tous vos constructeurs de classe initialisent les internes _THIS, Last_Center_Pos, Last_Zoom. Pour autant que je sache, ils devraient.


(! last_center_pos.quals.equals (getMapCenter ()) ||! is_touched) devrait être (! last_center_pos.equals (getMapCenter ()) &&! is_touchled) Sinon L'auditeur PAN déclenche en permanence lorsque l'utilisateur ne touche pas l'écran. Vous avez eu raison dans le commentaire ci-dessus de cette ligne où vous avez décrit les conditions utilisant 'et'.


J'ai créé une petite classe MAPView qui a trois événements, onclick, ong et onezoom ici .



0
votes

the MapChange Projet, publié à l'origine sur un questionImartics Ici , m'a aidé à FullFil la même tâche que vous avez demandée.


1 commentaires

Comme je vois, ils utilisent ma technique. Peut-être qu'ils étaient même inspirés par ma réponse présentée ci-dessus :) Quoi qu'il en soit, j'ai apprécié que quelqu'un l'a fait comme une bibliothèque distincte.



0
votes

Maintenant, cela peut être utilisé:

googleMap.setOnCameraIdleListener {
                //Do your thing
            }


0 commentaires