Déplacer un marqueur entre 2 coordonnées suivant les indications de conduite

Je veux déplacer un marqueur d'un Latlng vers un autre. J'ai utilisé ce code pour déplacer le marqueur en douceur en fonction de la distance et du temps.

public void animateMarker(final LatLng toPosition, final boolean hideMarker) { final Handler handler = new Handler(); final long start = SystemClock.uptimeMillis(); Projection proj = googleMap.getProjection(); Point startPoint = proj.toScreenLocation(cabMarker.getPosition()); final LatLng startLatLng = proj.fromScreenLocation(startPoint); final Interpolator interpolator = new LinearInterpolator(); handler.post(new Runnable() { @Override public void run() { Location prevLoc = new Location("service Provider"); prevLoc.setLatitude(startLatLng.latitude); prevLoc.setLongitude(startLatLng.longitude); Location newLoc = new Location("service Provider"); newLoc.setLatitude(toPosition.latitude); newLoc.setLongitude(toPosition.longitude); System.out.println("Locations ---- " + prevLoc + "-" + newLoc); float bearing = prevLoc.bearingTo(newLoc); long elapsed = SystemClock.uptimeMillis() - start; float t = interpolator.getInterpolation((float) elapsed / CAB_TRACK_INTERVAL); double lng = t * toPosition.longitude + (1 - t) * startLatLng.longitude; double lat = t * toPosition.latitude + (1 - t) * startLatLng.latitude; cabMarker.setPosition(new LatLng(lat, lng)); cabMarker.setRotation(bearing + 90); if (t < 1.0) { // Post again 16ms later. handler.postDelayed(this, 16); } else { if (hideMarker) { cabMarker.setVisible(false); } else { cabMarker.setVisible(true); } } } }); } 

Mais le problème est que le marqueur ne bouge pas sur les directions de conduite, mais en ligne droite de A à B. Est-il possible d'obtenir environ 10 points intermédiaires de la route entre A et B et ensuite le déplacer sur ce chemin?

  • L'application Messenger de Google n'attache pas d'image lors de l'envoi de MMS
  • Comment réparer "Support-v13: 19.1.0 dépend des bibliothèques mais n'est pas une bibliothèque elle-même"?
  • Type incompatibilité: impossible de convertir de StringBuilder en String
  • Comment créer des applications dans Android qui ne peuvent pas être désinstallées? Pouvons-nous créer des applications système?
  • Icône dans le menu qui ne s'affiche pas dans Android
  • Impossible de résoudre: com.google.android.gms: play-services-measurement: 9.0.2
  • 2 Solutions collect form web for “Déplacer un marqueur entre 2 coordonnées suivant les indications de conduite”

     import com.google.android.gms.maps.model.LatLng; import static java.lang.Math.asin; import static java.lang.Math.atan2; import static java.lang.Math.cos; import static java.lang.Math.pow; import static java.lang.Math.sin; import static java.lang.Math.sqrt; import static java.lang.Math.toDegrees; import static java.lang.Math.toRadians; public interface LatLngInterpolator { public LatLng interpolate(float fraction, LatLng a, LatLng b); public class Linear implements LatLngInterpolator { @Override public LatLng interpolate(float fraction, LatLng a, LatLng b) { double lat = (b.latitude - a.latitude) * fraction + a.latitude; double lng = (b.longitude - a.longitude) * fraction + a.longitude; return new LatLng(lat, lng); } } public class LinearFixed implements LatLngInterpolator { @Override public LatLng interpolate(float fraction, LatLng a, LatLng b) { double lat = (b.latitude - a.latitude) * fraction + a.latitude; double lngDelta = b.longitude - a.longitude; // Take the shortest path across the 180th meridian. if (Math.abs(lngDelta) > 180) { lngDelta -= Math.signum(lngDelta) * 360; } double lng = lngDelta * fraction + a.longitude; return new LatLng(lat, lng); } } public class Spherical implements LatLngInterpolator { /* From github.com/googlemaps/android-maps-utils */ @Override public LatLng interpolate(float fraction, LatLng from, LatLng to) { // http://en.wikipedia.org/wiki/Slerp double fromLat = toRadians(from.latitude); double fromLng = toRadians(from.longitude); double toLat = toRadians(to.latitude); double toLng = toRadians(to.longitude); double cosFromLat = cos(fromLat); double cosToLat = cos(toLat); // Computes Spherical interpolation coefficients. double angle = computeAngleBetween(fromLat, fromLng, toLat, toLng); double sinAngle = sin(angle); if (sinAngle < 1E-6) { return from; } double a = sin((1 - fraction) * angle) / sinAngle; double b = sin(fraction * angle) / sinAngle; // Converts from polar to vector and interpolate. double x = a * cosFromLat * cos(fromLng) + b * cosToLat * cos(toLng); double y = a * cosFromLat * sin(fromLng) + b * cosToLat * sin(toLng); double z = a * sin(fromLat) + b * sin(toLat); // Converts interpolated vector back to polar. double lat = atan2(z, sqrt(x * x + y * y)); double lng = atan2(y, x); return new LatLng(toDegrees(lat), toDegrees(lng)); } private double computeAngleBetween(double fromLat, double fromLng, double toLat, double toLng) { // Haversine's formula double dLat = fromLat - toLat; double dLng = fromLng - toLng; return 2 * asin(sqrt(pow(sin(dLat / 2), 2) + cos(fromLat) * cos(toLat) * pow(sin(dLng / 2), 2))); 

    Essayez ce code pour l'effet d'animation.

     public class MarkerAnimation { static void animateMarkerToGB(final Marker marker, final LatLng finalPosition, final LatLngInterpolator latLngInterpolator) { final LatLng startPosition = marker.getPosition(); final Handler handler = new Handler(); final long start = SystemClock.uptimeMillis(); final Interpolator interpolator = new AccelerateDecelerateInterpolator(); final float durationInMs = 3000; handler.post(new Runnable() { long elapsed; float t; float v; @Override public void run() { // Calculate progress using interpolator elapsed = SystemClock.uptimeMillis() - start; t = elapsed / durationInMs; v = interpolator.getInterpolation(t); marker.setPosition(latLngInterpolator.interpolate(v, startPosition, finalPosition)); // Repeat till progress is complete. if (t < 1) { // Post again 16ms later. handler.postDelayed(this, 16); } } }); } @TargetApi(Build.VERSION_CODES.HONEYCOMB) static void animateMarkerToHC(final Marker marker, final LatLng finalPosition, final LatLngInterpolator latLngInterpolator) { final LatLng startPosition = marker.getPosition(); ValueAnimator valueAnimator = new ValueAnimator(); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float v = animation.getAnimatedFraction(); LatLng newPosition = latLngInterpolator.interpolate(v, startPosition, finalPosition); marker.setPosition(newPosition); } }); valueAnimator.setFloatValues(0, 1); // Ignored. valueAnimator.setDuration(3000); valueAnimator.start(); } @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) static void animateMarkerToICS(Marker marker, LatLng finalPosition, final LatLngInterpolator latLngInterpolator) { TypeEvaluator<LatLng> typeEvaluator = new TypeEvaluator<LatLng>() { @Override public LatLng evaluate(float fraction, LatLng startValue, LatLng endValue) { return latLngInterpolator.interpolate(fraction, startValue, endValue); } }; Property<Marker, LatLng> property = Property.of(Marker.class, LatLng.class, "position"); ObjectAnimator animator = ObjectAnimator.ofObject(marker, property, typeEvaluator, finalPosition); animator.setDuration(3000); animator.start(); } } } } } 

    D'abord, vous devez demander à Google directions l'itinéraire du point A à B et il renverra une ligne poly qui contiendra les points souhaités, puis appelez la méthode d'animation de chaque point à point jusqu'à ce que vous ayez parcouru tous les points, puis vous pouvez seulement Faites en sorte que le marqueur parcourt un certain itinéraire lors de l'animation du point A à B. D'abord, lisez sur google directions API de google, puis mettez-le en œuvre et continuez

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.