Comment faire pour déplacer le marqueur le long d'une polyligne à l'aide de google map
Je suis en train de déplacer le marqueur selon la polyligne et de l'animation. Similaire à l'image ci-dessous:
Mapbox est déjà donner ce genre de démonstration. Mais je veux atteindre le même à l'aide de Google maps. Cependant dès maintenant mon marqueur n'est pas en rotation le long du chemin.
Voici ce que j'ai essayé:
private void onReady(List<LatLng> polyz) {
for (int i = 0; i < polyz.size() - 1; i++) {
LatLng src = polyz.get(i);
LatLng dest = polyz.get(i + 1);
Polyline line = map.addPolyline(new PolylineOptions()
.add(new LatLng(src.latitude, src.longitude),
new LatLng(dest.latitude, dest.longitude))
.width(2).color(Color.RED).geodesic(true));
}
LatLngBounds.Builder builder = new LatLngBounds.Builder();
builder.include(polyz.get(0));
builder.include(polyz.get(polyz.size()-1));
map.moveCamera(CameraUpdateFactory.newLatLngBounds(builder.build(), 48));
map.animateCamera(CameraUpdateFactory.zoomTo(7), 1000, null);
BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(R.drawable.car);
marker = map.addMarker(new MarkerOptions()
.position(polyz.get(0))
.title("Curr")
.snippet("Move"));
marker.setIcon(icon);
}
Et de l'animation:
private void animateMarker(GoogleMap myMap, final Marker marker, final List<LatLng> directionPoint,
final boolean hideMarker) {
final Handler handler = new Handler();
final long start = SystemClock.uptimeMillis();
Projection proj = myMap.getProjection();
final long duration = 600000;
final Interpolator interpolator = new LinearInterpolator();
handler.post(new Runnable() {
int i = 0;
@Override
public void run() {
long elapsed = SystemClock.uptimeMillis() - start;
float t = interpolator.getInterpolation((float) elapsed
/ duration);
Location location=new Location(String.valueOf(directionPoint.get(i)));
Location newlocation=new Location(String.valueOf(directionPoint.get(i+1)));
marker.setAnchor(0.5f, 0.5f);
marker.setRotation(location.bearingTo(newlocation) - 45);
if (i < directionPoint.size()) {
marker.setPosition(directionPoint.get(i));
}
i++;
if (t < 1.0) {
//Post again 16ms later.
handler.postDelayed(this, 16);
} else {
if (hideMarker) {
marker.setVisible(false);
} else {
marker.setVisible(true);
}
}
}
});
}
- avez-vous résolu ce
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser pour votre travail que votre approche fondée sur un marqueur personnalisé animation: animer séparément le mouvement du wagon et la voiture tourne dans tous les points directeurs. Pour cela, Vous avez besoin de 2 types d'animation:
1) animation pour le mouvement du wagon;
2) animation pour les voitures de tour;
qui appelle les uns des autres sur sa fin (le mouvement du wagon de l'animation sur la fin appels de voiture tourner animation et vice versa: la voiture de tourner animation sur sa fin appels de voiture de mouvement, d'animation et donc pour tous les points de la voiture de chemin d'accès).
Par exemple sur la fig.:
1) animation pour le mouvement du wagon de
P0
àP1
;2) animation pour la voiture tourner sur
P1
;3) animation pour le mouvement du wagon de
P1
àP2
et ainsi de suite.
Voiture de mouvement d'animation peut être mis en œuvre par la méthode comme ceci:
où
mMarkerIcon
est:et de voiture sur l'icône doit être orientée Nord:
pour corriger la rotation s'appliquent
nextTurnAnimation()
- méthode appelée sur l'extrémité de la voiture en mouvement, de l'animation pour démarrer la voiture tourner animation:À son tour à la voiture de tourner à l'animation de la méthode peut être comme ceci:
où
nextMoveAnimation()
est:La
mPathPolygonPoints
(geopoints de trajet en voiture) est:Et la
mIndexCurrentPoint
variable est l'indice de point actuel sur le chemin d'accès (il devrait être 0 au début de l'animation et incrémenté à chaque tour de chemin dansnextTurnAnimation()
méthode).TURN_ANIMATION_DURATION
- durée (en ms) de l'animation pour la voiture tourner sur le chemin geopoint;MOVE_ANIMATION_DURATION
- durée (en ms) de l'animation pour les voitures circulation dans le segment de la ligne de chemin;Pour obtenir de roulement, Vous pouvez utiliser la méthode comme ça:
Enfin, Vous pouvez lancer toutes les animations par appel
animateCarMove()
une fois:les autres étapes de l'animation sera appelé automatiquement pour chaque point de la voiture de chemin.
Et Vous devez prendre en compte certains "cas spéciaux" comme:
1) changement de signe de de la tour d'angle (par exemple, portant modifications de -120 à 150 degrés);
2) les possibilités d'interruption de l'animation par l'utilisateur;
3) calculer animation durée sur le chemin de la longueur du segment (par exemple, 1 sec de 1 km de longueur de segment au lieu de fixe
MOVE_ANIMATION_DURATION
)4) probablement tune valeur
16
danshandler.postDelayed(this, 16);
ligne pour de meilleures performances;5) et ainsi de suite.
marker.setAnchor(0.5f, 0.5f);
(ou quelque chose comme ça) aprèsmarker.setIcon(..)
ligne. Alors, peut-être, ajuster0.5f, 0.5f
des paramètres à d'autres, si nécessaire.Le problème est la façon dont vous créez votre
Location
objets. Vous êtes à l'aide de laLocation (String provider)
constructeur qui la Construction d'un nouvel Emplacement avec un nom de fournisseur (documentation):Dans votre cas, vous ne créez pas un
Location
de vos coordonnées, mais unLocation
dont le nom du fournisseur estString.valueOf(directionPoint.get(i))
mais laLocation
les objets sont créés avec la latitude et la longitude = 0.La bonne façon de créer de la
Location
objets est comme suit:De toute façon prendre en compte que vous aurez une
ArrayIndexOutOfBoundsException
parce que vous ne prenez pas en compte le fait quei+1
sera==directionPoint.size()
à la fin.SphericalUtil.computeHeading(beginLatLng,endLatLng)
pour le calcul des roulements. Le marqueur tourne mais pas sans heurts que, lorsque c'est faire souffrir.Je pense que ce que vous cherchez est Marqueur Animations.
Voici un extrait de ce guide: