Search code examples
androidgoogle-mapsgoogle-maps-markersgoogle-polyline

Polylines not smoothly traced in Google Maps Android


I'm using following code to animate polylines tracing on Google Maps. Polylines are getting traced as per LatLong list(markerPojoList). I've achieved smoothness in tracing to some extent but I want these lines to be traced in more smoother manner.

`private void animateMarkers(final Marker marker) {
  final PolylineOptions polylineOptions = new PolylineOptions().color(Color.RED);
  final Handler handler = new Handler();
            handler.post(new Runnable() {
                @Override
                public void run() {
                    ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 
     1);
                    valueAnimator.setDuration(0);
                    valueAnimator.setInterpolator(new LinearInterpolator());
                    valueAnimator.addUpdateListener(new 
                    ValueAnimator.AnimatorUpdateListener() {
                        @Override
                        public void onAnimationUpdate(ValueAnimator 
         valueAnimator) {     
                        v = valueAnimator.getAnimatedFraction();                  
                        if (i < markerPojoList.size()){         
                        lng = v * markerPojoList.get((i + 1) - 
         1).getLongitude() + 
                        (1 - v)   * markerPojoList.get(i).getLongitude();
                        lat = v * markerPojoList.get((i + 1) - 1).getLattitude() + 
                        (1 - v)markerPojoList.get(i).getLattitude();
                        LatLng newPos = new LatLng(lat, lng);
                        marker.setPosition(newPos);
                        polylineOptions.add(newPos);
                        line = mMap.addPolyline(polylineOptions);
                        mMap.moveCamera(CameraUpdateFactory
                        .newCameraPosition(new CameraPosition.Builder()
                        .target(newPos)
                        .zoom(mMap.getCameraPosition().zoom)
                        .build()));
}}});
valueAnimator.start();
i++;
if (i < markerPojoList.size())
handler.postDelayed(this, 10);
}
});
}`

Solution

  • I have edited your code try this

    private void animateMarkers(final Marker marker) {
        final PolylineOptions polylineOptions = new PolylineOptions().color(Color.RED);
        final Handler handler = new Handler();
        handler.post(new Runnable() {
            @Override
            public void run() {
                ValueAnimator valueAnimator = ValueAnimator.ofFloat(0,
                        1);
                valueAnimator.setDuration(0);
                valueAnimator.setInterpolator(new LinearInterpolator());
                valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator
                                                          valueAnimator) {
                        if (i < markerPojoList.size()) {
                            lng = v * markerPojoList.get((i + 1) - 1).getLongitude() + markerPojoList.get(i).getLongitude();
                            lat = v * markerPojoList.get((i + 1) - 1).getLattitude() + markerPojoList.get(i).getLattitude();
                            LatLng newPos = new LatLng(lat, lng);
                            marker.setPosition(newPos);
                            polylineOptions.add(newPos);
                            line = mMap.addPolyline(polylineOptions);
                            mMap.moveCamera(CameraUpdateFactory
                                    .newCameraPosition(new CameraPosition.Builder()
                                            .target(newPos)
                                            .zoom(mMap.getCameraPosition().zoom)
                                            .build()));
                        }
                    }
                });
                valueAnimator.start();
                i++;
                if (i < markerPojoList.size())
                    handler.postDelayed(this, 10);
            }
        });
    }