Search code examples
androidgoogle-mapsmylocationoverlay

Animated Drawable MyLocationOverlay()


Is it possible to over-ride MyLocationOverlay()'s onDraw method and replace the standard flashing blue icon with something else. What are the ways I could implement this?


Solution

  • Really good answer to your question here: myLocationOverlay change the marker

    Draw an animated GIF image within the drawMyLocation(..) function. Display Animated GIF

    public class CurrentLocationOverlay extends MyLocationOverlay {
    
      // TODO: use dynamic calculation?
      private final static int PADDING_ACTIVE_ZOOM     = 50;
    
      private MapController    mc;
      private Bitmap           marker;
      private Point            currentPoint            = new Point();
    
      private boolean          centerOnCurrentLocation = true;
    
      private int              height;
      private int              width;
    
      /**
       * By default this CurrentLocationOverlay will center on the current location, if the currentLocation is near the
       * edge, or off the screen. To dynamically enable/disable this, use {@link #setCenterOnCurrentLocation(boolean)}.
       *
       * @param context
       * @param mapView
       */
      public CurrentLocationOverlay(Context context, MapView mapView) {
        super(context, mapView);
        this.mc = mapView.getController();
        this.marker = BitmapFactory.decodeResource(context.getResources(), R.drawable.position);
      }
    
      @Override
      protected void drawMyLocation(Canvas canvas, MapView mapView, Location lastFix, GeoPoint myLocation, long when) {
        // TODO: find a better way to get height/width once the mapView is layed out correctly
        if (this.height == 0) {
          this.height = mapView.getHeight();
          this.width = mapView.getWidth();
        }
        mapView.getProjection().toPixels(myLocation, currentPoint);
        canvas.drawBitmap(marker, currentPoint.x, currentPoint.y - 40, null);
      }
    
      @Override
      public synchronized void onLocationChanged(Location location) {
        super.onLocationChanged(location);
        // only move to new position if enabled and we are in an border-area
        if (mc != null && centerOnCurrentLocation && inZoomActiveArea(currentPoint)) {
          mc.animateTo(getMyLocation());
        }
      }
    
      private boolean inZoomActiveArea(Point currentPoint) {
        if ((currentPoint.x > PADDING_ACTIVE_ZOOM && currentPoint.x < width - PADDING_ACTIVE_ZOOM)
            && (currentPoint.y > PADDING_ACTIVE_ZOOM && currentPoint.y < height - PADDING_ACTIVE_ZOOM)) {
          return false;
        }
        return true;
      }
    
      public void setCenterOnCurrentLocation(boolean centerOnCurrentLocation) {
        this.centerOnCurrentLocation = centerOnCurrentLocation;
      }
    }