Search code examples
androidmapboxpolylinemapbox-marker

Marker moving through polyline in Mapbox


I'm facing a real challenge which I hope you guys can help me figure out. I'm creating a polyline for given Position objects, and what I'd want to do, is to put a custom marker in the origin and make it move all through the polyline, not necessarily tracking a position, just moving over the polyline.

My first step was creating an ObjectAnimation object, and make it move in a line from one marker to another, but i'm not figuring out how can I make it move along my polyline and not in a line.

Thank you in advance, and any further information you guys need to clarify the issue, i'm viewing this topic at every time!


Solution

  • We have an example for this

    you're correct in using an object animator, you also need to make use of a handler to keep updating the position.

    // Animating the marker requires the use of both the ValueAnimator and a handler.
        // The ValueAnimator is used to move the marker between the GeoJSON points, this is
        // done linearly. The handler is used to move the marker along the GeoJSON points.
        handler = new Handler();
        runnable = new Runnable() {
          @Override
          public void run() {
    
            // Check if we are at the end of the points list, if so we want to stop using
            // the handler.
            if ((points.size() - 1) > count) {
    
              // Calculating the distance is done between the current point and next.
              // This gives us the duration we will need to execute the ValueAnimator.
              // Multiplying by ten is done to slow down the marker speed. Adjusting
              // this value will result in the marker traversing faster or slower along
              // the line
              distance = (long) marker.getPosition().distanceTo(points.get(count)) * 10;
    
              // animate the marker from it's current position to the next point in the
              // points list.
              ValueAnimator markerAnimator = ObjectAnimator.ofObject(marker, "position",
                  new LatLngEvaluator(), marker.getPosition(), points.get(count));
              markerAnimator.setDuration(distance);
              markerAnimator.setInterpolator(new LinearInterpolator());
              markerAnimator.start();
    
              // This line will make sure the marker appears when it is being animated
              // and starts outside the current user view. Without this, the user must
              // intentionally execute a gesture before the view marker reappears on
              // the map.
              map.getMarkerViewManager().update();
    
              // Keeping the current point count we are on.
              count++;
    
              // Once we finish we need to repeat the entire process by executing the
              // handler again once the ValueAnimator is finished.
              handler.postDelayed(this, distance);
            }
          }
        };
        handler.post(runnable);