Animate the rotation of the Marker in google map v2

后端 未结 8 1978
感情败类
感情败类 2020-12-16 07:19

i am using google maps v2. i have a marker on map, this marker changes rotation every while. I want to animate the rotation of my maker to rotate smoothly. Can anyone help p

8条回答
  •  旧时难觅i
    2020-12-16 07:46

    Here is the simple example You can use the following MarkerAnimation class for animating marker with rotation.

    import android.graphics.Point;
    import android.location.Location;
    import android.os.Handler;
    import android.os.SystemClock;
    import android.view.animation.Interpolator;
    import android.view.animation.LinearInterpolator;
    
    import com.gogrocerycart.settings.Constants;
    import com.google.android.gms.maps.GoogleMap;
    import com.google.android.gms.maps.Projection;
    import com.google.android.gms.maps.model.LatLng;
    import com.google.android.gms.maps.model.Marker;
    
    /**
     * Created by Vinil Chandran on 7/6/18.
     */
    
    public class MarkerAnimation {
        private static Location fromPosition;
        private static float angle = 0;
        public static void move(GoogleMap mMap, final Marker marker, final Location toPosition) {
            if (fromPosition != null && marker != null && toPosition != null) {
                final Handler handlerRotation = new Handler();
                final long startAngle = SystemClock.uptimeMillis();
                final float startRotation = marker.getRotation();
                final long durationRotation = 300;
                final Interpolator interpolatorRotation = new LinearInterpolator();
                float bearing = fromPosition.bearingTo(toPosition);
                Print.e("Bearing:" + bearing);
                angle = bearing<0?(360+bearing):bearing;
                angle = angle%360f;
                Print.e("Angle:" + angle);
                handlerRotation.post(new Runnable() {
                    @Override
                    public void run() {
                        long elapsed = SystemClock.uptimeMillis() - startAngle;
                        float t = interpolatorRotation.getInterpolation((float) elapsed / durationRotation);
                        float rot = t * angle + (1 - t) * startRotation;
                        float mAngle = -rot > 180 ? rot / 2 : rot;
                        marker.setRotation(mAngle);
    
                        if (t < 1.0) {
                            handlerRotation.postDelayed(this, 16);
                        } else {
                            final Handler handler = new Handler();
                            final long start = SystemClock.uptimeMillis();
                            Projection projection = mMap.getProjection();
                            Point startPoint = projection.toScreenLocation(marker.getPosition());
                            final LatLng startLatLng = projection.fromScreenLocation(startPoint);
                            final long duration = Constants.LOCATION_REQUEST_INTERVAL;
                            final Interpolator interpolator = new LinearInterpolator();
                            handler.post(new Runnable() {
                                @Override
                                public void run() {
                                    long elapsed = SystemClock.uptimeMillis() - start;
                                    float t = interpolator.getInterpolation((float) elapsed
                                            / duration);
                                    double lng = t * toPosition.getLongitude() + (1 - t)
                                            * startLatLng.longitude;
                                    double lat = t * toPosition.getLatitude() + (1 - t)
                                            * startLatLng.latitude;
                                    marker.setPosition(new LatLng(lat, lng));
                                    if (t < 1.0) {
                                        // Post again 16ms later.
                                        handler.postDelayed(this, 16);
                                    }
                                }
                            });
                        }
                    }
                });
            }
            fromPosition = toPosition;
        }
    }
    

    Just call the following code for moving the marker when the location is changed.

    if (carMarker != null) {
          MarkerAnimation.move(mMap,carMarker, location);
    }
    

提交回复
热议问题