89 lines
2.6 KiB
Java
89 lines
2.6 KiB
Java
package org.insa.graphics.drawing.overlays;
|
|
|
|
import java.awt.Color;
|
|
import java.util.List;
|
|
|
|
import org.insa.graph.Point;
|
|
import org.mapsforge.core.graphics.Canvas;
|
|
import org.mapsforge.core.graphics.GraphicFactory;
|
|
import org.mapsforge.core.graphics.Style;
|
|
import org.mapsforge.core.model.BoundingBox;
|
|
import org.mapsforge.core.model.LatLong;
|
|
import org.mapsforge.map.awt.graphics.AwtGraphicFactory;
|
|
import org.mapsforge.map.layer.overlay.Polyline;
|
|
|
|
/**
|
|
* Class extending the default Mapsforge's {@link Polyline} with auto-scaling.
|
|
*
|
|
* Mapsforge's Polylines do not scale with zoom level, this class aims at
|
|
* correcting this. When a redraw is requested, the width of the line is
|
|
* recomputed for the current zoom level.
|
|
*
|
|
* @see PaintUtils#getStrokeWidth(int, byte)
|
|
*/
|
|
public class PolylineAutoScaling extends Polyline {
|
|
|
|
// Graphic factory.
|
|
private static final GraphicFactory GRAPHIC_FACTORY = AwtGraphicFactory.INSTANCE;
|
|
|
|
// Original width of the polyline.
|
|
private final int width;
|
|
|
|
/**
|
|
* Create a new PolylineAutoScaling with the given width and color.
|
|
*
|
|
* @param width Original width of the line (independent of the zoom level).
|
|
* @param color Color of the line.
|
|
*
|
|
* @see PaintUtils#getStrokeWidth(int, byte)
|
|
*/
|
|
public PolylineAutoScaling(int width, Color color) {
|
|
super(GRAPHIC_FACTORY.createPaint(), GRAPHIC_FACTORY);
|
|
getPaintStroke().setColor(PaintUtils.convertColor(color));
|
|
getPaintStroke().setStyle(Style.STROKE);
|
|
this.width = width;
|
|
}
|
|
|
|
/**
|
|
* Set the color for this polyline.
|
|
*
|
|
* @param color New color for this polyline.
|
|
*/
|
|
public void setColor(Color color) {
|
|
getPaintStroke().setColor(PaintUtils.convertColor(color));
|
|
}
|
|
|
|
/**
|
|
* @return Color of this polyline.
|
|
*/
|
|
public Color getColor() {
|
|
return PaintUtils.convertColor(getPaintStroke().getColor());
|
|
}
|
|
|
|
/**
|
|
* @param point Point to add to this line.
|
|
*/
|
|
public void add(Point point) {
|
|
getLatLongs().add(new LatLong(point.getLatitude(), point.getLongitude()));
|
|
}
|
|
|
|
/**
|
|
* @param points Points to add to this line.
|
|
*/
|
|
public void add(List<Point> points) {
|
|
for (Point point: points) {
|
|
add(point);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public synchronized void draw(BoundingBox boundingBox, byte zoomLevel, Canvas canvas,
|
|
org.mapsforge.core.model.Point topLeftPoint) {
|
|
|
|
// Update paint stroke with width for level
|
|
this.getPaintStroke().setStrokeWidth(PaintUtils.getStrokeWidth(width, zoomLevel));
|
|
|
|
super.draw(boundingBox, zoomLevel, canvas, topLeftPoint);
|
|
}
|
|
|
|
}
|