/*
* Copyright (c) 2015 Daimler AG / Moovel GmbH
*
* All rights reserved
*/
package com.car2go.maps.osm.drawable;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import com.car2go.maps.model.Circle;
import com.car2go.maps.model.CircleOptions;
import org.osmdroid.api.IGeoPoint;
import org.osmdroid.views.MapView;
import org.osmdroid.views.Projection;
import org.osmdroid.views.overlay.Overlay;
import static com.car2go.maps.osm.util.OsmUtils.toGeoPoint;
/**
* Draws circle on OpenStreetMaps.
* Associated with given {@link com.car2go.maps.AnyMap} object, so it should not be cached.
*/
public class OsmCircle implements Circle {
private final MapView map;
private final CircleOverlay overlay;
OsmCircle(MapView map, CircleOptions options) {
this.map = map;
overlay = new CircleOverlay(map.getContext(), options);
map.getOverlays().add(overlay);
map.invalidate();
}
@Override
public void setVisible(boolean visible) {
overlay.setEnabled(visible);
map.invalidate();
}
@Override
public void remove() {
map.getOverlays().remove(overlay);
map.invalidate();
}
/**
* Overlay which draws a single circle on OpenStreetMap
*/
private static class CircleOverlay extends Overlay {
private final IGeoPoint position;
private final float radius;
private final Paint fillPaint;
private final Paint strokePaint;
private final Point auxPoint = new Point();
public CircleOverlay(Context context, CircleOptions options) {
super(context);
position = toGeoPoint(options.getCenter());
radius = (float) options.getRadius();
fillPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
fillPaint.setStyle(Paint.Style.FILL);
fillPaint.setColor(options.getFillColor());
strokePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
strokePaint.setStyle(Paint.Style.STROKE);
strokePaint.setColor(options.getStrokeColor());
strokePaint.setStrokeWidth(options.getStrokeWidth());
}
@Override
protected void draw(Canvas c, MapView osmv, boolean shadow) {
Projection projection = osmv.getProjection();
Point centerPoint = projection.toPixels(position, auxPoint);
float radiusPixels = projection.metersToPixels(radius);
c.drawCircle(
centerPoint.x,
centerPoint.y,
radiusPixels,
fillPaint
);
c.drawCircle(
centerPoint.x,
centerPoint.y,
radiusPixels,
strokePaint
);
}
}
}