Wie bewegen Markierung entlang Polylinie mit google-map
Ich versuche mich zu bewegen der marker nach der Polylinie und mit animation. Ähnlich wie auf dem unten Bild:
Mapbox ist bereits was diese Art von demo. Aber ich möchte, um das gleiche zu erreichen über Google-maps. Aber jetzt meine marker nicht drehen, die entlang des Pfades.
Hier ist was ich versucht habe:
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);
}
Und die 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);
}
}
}
});
}
- haben Sie das Problem gelöst
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie für Ihre Aufgabe, Ihren Ansatz, basierend auf benutzerdefinierten marker animation: animiert separat Bewegung Auto und das Auto dreht sich in alle Richtung Punkte. Dafür benötigen Sie 2 Arten von animation:
1) animation für Bewegung Auto;
2) animation für Auto-drehen;
fordert einander auf deren Ende (Auto-Bewegung-animation am Ende ruft Auto-turn-animation und Umgekehrt: Auto-turn-animation am Ende fordert, Auto, Bewegung, animation und so für alle Punkte von dem Auto Weg).
Zum Beispiel auf der Abb.:
1) animation für Auto-Bewegung aus
P0
zuP1
;2) animation für Auto-turn-on
P1
;3) animation für Auto-Bewegung aus
P1
zuP2
und so weiter.
Auto-Bewegung-animation umgesetzt werden können, durch die Methode, wie diese:
wo
mMarkerIcon
ist:- und Auto-Symbol sollte nach Norden ausgerichtet:
korrekte Drehrichtung gelten
nextTurnAnimation()
- Methode aufgerufen, Ende Bewegung Auto-animation zu starten, Auto-turn-animation:Wiederum Auto-turn-animation-Methode kann wie folgt sein:
wo
nextMoveAnimation()
ist:Den
mPathPolygonPoints
(geopoints von Auto, Reise):Und die
mIndexCurrentPoint
variable ist der index der aktuellen Position auf Pfad (es sollte 0 sein, zum start der animation und erhöht auf jede Wendung der Pfad innextTurnAnimation()
- Methode).TURN_ANIMATION_DURATION
- Dauer (in ms) animation für Auto-turn-Pfad auf geopoint;MOVE_ANIMATION_DURATION
- Dauer (in ms) animation für car Bewegung entlang der Linie segment des Pfades;Bekommen Lager, das Sie können, verwenden Sie die Methode so:
Schließlich können Sie beginnen, alle Animationen-by-call
animateCarMove()
einmal:anderen Schritte der animation aufgerufen wird, werden automatisch für jeden Punkt von dem Auto Weg.
Und Sie sollten take in Konto einige "Sonderfälle" wie:
1) wechselnde Vorzeichen der Drehwinkel (z.B. bei änderungen von -120 bis 150°);
2) Möglichkeiten für unterbrechen der animation durch den Benutzer;
3) berechnen Sie die Animations-Dauer auf Pfad-segment Länge (z.B. 1 sec für 1 km Länge von Segmenten anstelle von fixen
MOVE_ANIMATION_DURATION
)4) wahrscheinlich tune Wert
16
imhandler.postDelayed(this, 16);
Linie für eine bessere performance;5) und so weiter.
marker.setAnchor(0.5f, 0.5f);
(oder so ähnlich) nachmarker.setIcon(..)
Linie. Dann, möglicherweise, passen0.5f, 0.5f
Parameter an andere, wenn erforderlich.Das problem ist die Art und Weise der Erstellung Ihrer
Location
Objekte. Sie sind mit derLocation (String provider)
Konstruktor, der Konstruieren eine neue Stelle mit einem namens-Anbieter (Dokumentation):In Ihrem Fall sind Sie nicht die Schaffung eines
Location
mit den gewünschten Koordinaten, sondern eineLocation
dessen provider ist der nameString.valueOf(directionPoint.get(i))
aber dieLocation
Objekte erstellt werden, mit Längen-und Breitengrad = 0.Den richtigen Weg, um die
Location
Objekte ist wie folgt:Sowieso berücksichtigen, dass Sie eine
ArrayIndexOutOfBoundsException
weil Sie nicht berücksichtigt, dassi+1
wird==directionPoint.size()
am Ende.SphericalUtil.computeHeading(beginLatLng,endLatLng)
für die lagerberechnung. Die Markierung dreht sich aber nicht reibungslos, dass dort, wo es schmerzt.Ich denke was du suchst ist Marker-Animationen.
Hier ist ein Ausschnitt aus der Anleitung: