33

I need to do the following: I have a Marker on the map and I need to change the position of it. So I tried the following:

MarkerOptions a = new MarkerOptions()
            .position(new LatLng(50,6)));
        map.addMarker(a);
        a.position(new LatLng(50,5));

where map is a GoogleMap. I think I have to refresh the map or somthing equal?

gurehbgui
  • 14,236
  • 32
  • 106
  • 178

4 Answers4

91

Found the solution, Need to do it like this:

MarkerOptions a = new MarkerOptions()
    .position(new LatLng(50,6)));
Marker m = map.addMarker(a);
m.setPosition(new LatLng(50,5));
gurehbgui
  • 14,236
  • 32
  • 106
  • 178
24

There's one example of moving marker in google map v2 demo app .. In file adt-bundle-linux/sdk/extras/google/google_play_services/samples/maps/src/com/exa‌​mple/mapdemo/MarkerDemoActivity.java (4.2.2 examples)

Here the code for moving a marker:

public void animateMarker(final Marker marker, final LatLng toPosition, final boolean hideMarker) {
    final Handler handler = new Handler();
    final long start = SystemClock.uptimeMillis();
    Projection proj = mGoogleMapObject.getProjection();
    Point startPoint = proj.toScreenLocation(marker.getPosition());
    final LatLng startLatLng = proj.fromScreenLocation(startPoint);
    final long duration = 500;

    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.longitude + (1 - t)
                    * startLatLng.longitude;
            double lat = t * toPosition.latitude + (1 - t)
                    * startLatLng.latitude;
            marker.setPosition(new LatLng(lat, lng));

            if (t < 1.0) {
                // Post again 16ms later.
                handler.postDelayed(this, 16);
            } else {
                if (hideMarker) {
                    marker.setVisible(false);
                } else {
                    marker.setVisible(true);
                }
            }
        }
    });
}

This code will animate the marker from one geopoint to another.

Max Base
  • 639
  • 1
  • 7
  • 15
K_Anas
  • 31,226
  • 9
  • 68
  • 81
19

Most of the answers on StackOverflow suggest using remove() to remove the marker and then create a new one using addMarker . Instead of doing that, simply save the marker once in a Marker type variable and then update its location.

MarkerOptions a = new MarkerOptions().position(new LatLng(50,6))); 
myMarker = mGoogleMap.addMarker(a);

And then instead of removing and re-creating a marker, simply use

myMarker.setPosition(newLatLng);  

Hope this helps !!

Shailesh
  • 2,116
  • 4
  • 28
  • 48
5

Define "marker" outside the function. for the first time, it will be null and "if" condition will be executed. for the second time "else" will be executed.

        Marker marker = null;    
        protected void onPostExecute(Coordinates coordinates) {
        LatLng latLong = new LatLng("lat", "long");
        if (marker == null) {
            MarkerOptions options = new MarkerOptions().position(latLong)
                    .title("Marker Title");
            marker = mMap.addMarker(options);
        }
        else {
            marker.setPosition(latLong);
        }
     mMap.moveCamera(CameraUpdateFactory.newLatLng(latLong));
     mMap.animateCamera(CameraUpdateFactory.zoomTo(16f));
    }