package org.moap.overlays;
import java.util.ArrayList;
import java.util.List;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;
import com.google.android.maps.Projection;
public class GoogleMapsOverlay extends Overlay {
private List<OverlayItem> items;
private int color;
public GoogleMapsOverlay(int color) {
items = new ArrayList<OverlayItem>();
this.color = color;
}
public void addOverlayItem(OverlayItem item) {
this.items.add(item);
}
public boolean draw(Canvas canvas, MapView mapv, boolean shadow,
long when) {
int size = items.size();
Projection projection = mapv.getProjection();
if (shadow == false) {
// Line Paint
Paint paint = new Paint();
paint.setDither(true);
paint.setColor(this.color);
paint.setAlpha(120);
paint.setStyle(Paint.Style.FILL_AND_STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeCap(Paint.Cap.ROUND);
paint.setStrokeWidth(10);
// Point Paint
Paint whitePaint = new Paint();
whitePaint.setDither(true);
whitePaint.setColor(Color.WHITE);
whitePaint.setStyle(Paint.Style.FILL_AND_STROKE);
whitePaint.setStrokeJoin(Paint.Join.ROUND);
whitePaint.setStrokeCap(Paint.Cap.ROUND);
whitePaint.setStrokeWidth(10);
// Point Paint
Paint pointPaint = new Paint();
pointPaint.setDither(true);
pointPaint.setColor(this.color);
pointPaint.setStyle(Paint.Style.FILL_AND_STROKE);
pointPaint.setStrokeJoin(Paint.Join.ROUND);
pointPaint.setStrokeCap(Paint.Cap.ROUND);
pointPaint.setStrokeWidth(10);
// Accuracy Paint
Paint accuracyPaint = new Paint();
accuracyPaint.setDither(true);
accuracyPaint.setColor(this.color);
accuracyPaint.setAlpha(50);
accuracyPaint.setStyle(Paint.Style.FILL_AND_STROKE);
accuracyPaint.setStrokeJoin(Paint.Join.ROUND);
accuracyPaint.setStrokeCap(Paint.Cap.ROUND);
accuracyPaint.setStrokeWidth(10);
/*
* Nothing to do
*/
if (size == 0) {
return true;
}
/*
* Draw one single point
*/
if (size == 1) {
OverlayItem oi = this.items.get(0);
mapv.getController().setCenter(oi.getPoint());
Point p = new Point();
projection.toPixels(oi.getPoint(), p);
canvas.drawCircle(p.x, p.y, 30f, accuracyPaint);
canvas.drawCircle(p.x, p.y, 5f, pointPaint);
canvas.drawCircle(p.x, p.y, 2.5f, whitePaint);
}
/*
* Draw Paths
*/
else {
// Draw linestrings
Path mainPath = new Path();
for (int i = 1; i < size; i++) {
GeoPoint previousPoint = items.get(i - 1).getPoint();
GeoPoint currentPoint = items.get(i).getPoint();
Point p1 = new Point();
Point p2 = new Point();
Path path = new Path();
projection.toPixels(previousPoint, p1);
projection.toPixels(currentPoint, p2);
path.moveTo(p2.x, p2.y);
path.lineTo(p1.x, p1.y);
mainPath.addPath(path);
}
canvas.drawPath(mainPath, paint);
// // Draw the last position
OverlayItem oi = this.items.get(this.items.size() - 1);
Point p = new Point();
projection.toPixels(oi.getPoint(), p);
canvas.drawCircle(p.x, p.y, 30f, accuracyPaint);
canvas.drawCircle(p.x, p.y, 5f, pointPaint);
canvas.drawCircle(p.x, p.y, 1.5f, whitePaint);
}
}
return super.draw(canvas, mapv, shadow, when);
}
}