package carnero.cgeo.mapcommon; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Point; import android.graphics.Paint.Style; import android.graphics.PaintFlagsDrawFilter; import android.location.Location; import carnero.cgeo.R; import carnero.cgeo.cgBase; import carnero.cgeo.cgSettings; import carnero.cgeo.mapinterfaces.GeoPointImpl; import carnero.cgeo.mapinterfaces.MapFactory; import carnero.cgeo.mapinterfaces.MapProjectionImpl; import carnero.cgeo.mapinterfaces.OverlayBase; import carnero.cgeo.mapinterfaces.MapViewImpl; import java.util.ArrayList; public class cgMapMyOverlay implements OverlayBase { private cgSettings settings = null; private Location coordinates = null; private GeoPointImpl location = null; private Double heading = new Double(0); private Paint accuracyCircle = null; private Paint historyLine = null; private Paint historyLineShadow = null; private Point center = new Point(); private Point left = new Point(); private Bitmap arrow = null; private int widthArrow = 0; private int heightArrow = 0; private PaintFlagsDrawFilter setfil = null; private PaintFlagsDrawFilter remfil = null; private Location historyRecent = null; private ArrayList<Location> history = new ArrayList<Location>(); private Point historyPointN = new Point(); private Point historyPointP = new Point(); public cgMapMyOverlay(cgSettings settingsIn) { settings = settingsIn; } public void setCoordinates(Location coordinatesIn) { coordinates = coordinatesIn; location = settings.getMapFactory().getGeoPointBase((int)(coordinatesIn.getLatitude() * 1e6), (int)(coordinatesIn.getLongitude() * 1e6)); } public void setHeading(Double headingIn) { heading = headingIn; } @Override public void drawOverlayBitmap(Canvas canvas, Point drawPosition, MapProjectionImpl projection, byte drawZoomLevel) { drawInternal(canvas, projection); } @Override public void draw(Canvas canvas, MapViewImpl mapView, boolean shadow) { drawInternal(canvas, mapView.getMapProjection()); } private void drawInternal(Canvas canvas, MapProjectionImpl projection) { if (coordinates == null || location == null) return; MapFactory mapFactory = settings.getMapFactory(); if (accuracyCircle == null) { accuracyCircle = new Paint(); accuracyCircle.setAntiAlias(true); accuracyCircle.setStrokeWidth(1.0f); } if (historyLine == null) { historyLine = new Paint(); historyLine.setAntiAlias(true); historyLine.setStrokeWidth(3.0f); historyLine.setColor(0xFFFFFFFF); } if (historyLineShadow == null) { historyLineShadow = new Paint(); historyLineShadow.setAntiAlias(true); historyLineShadow.setStrokeWidth(7.0f); historyLineShadow.setColor(0x66000000); } if (setfil == null) setfil = new PaintFlagsDrawFilter(0, Paint.FILTER_BITMAP_FLAG); if (remfil == null) remfil = new PaintFlagsDrawFilter(Paint.FILTER_BITMAP_FLAG, 0); canvas.setDrawFilter(setfil); double latitude = coordinates.getLatitude(); double longitude = coordinates.getLongitude(); float accuracy = coordinates.getAccuracy(); float[] result = new float[1]; Location.distanceBetween(latitude, longitude, latitude, longitude + 1, result); float longitudeLineDistance = result[0]; GeoPointImpl leftGeo = mapFactory.getGeoPointBase((int)(latitude * 1e6), (int)((longitude - accuracy / longitudeLineDistance) * 1e6)); projection.toPixels(leftGeo, left); projection.toPixels(location, center); int radius = center.x - left.x; accuracyCircle.setColor(0x66000000); accuracyCircle.setStyle(Style.STROKE); canvas.drawCircle(center.x, center.y, radius, accuracyCircle); accuracyCircle.setColor(0x08000000); accuracyCircle.setStyle(Style.FILL); canvas.drawCircle(center.x, center.y, radius, accuracyCircle); if (coordinates.getAccuracy() < 50f && ((historyRecent != null && cgBase.getDistance(historyRecent.getLatitude(), historyRecent.getLongitude(), coordinates.getLatitude(), coordinates.getLongitude()) > 0.005) || historyRecent == null)) { if (historyRecent != null) history.add(historyRecent); historyRecent = coordinates; int toRemove = history.size() - 700; if (toRemove > 0) { for (int cnt = 0; cnt < toRemove; cnt ++) { history.remove(cnt); } } } if (settings.maptrail == 1) { int size = history.size(); if (size > 1) { int alpha = 0; int alphaCnt = size - 201; if (alphaCnt < 1) alphaCnt = 1; for (int cnt = 1; cnt < size; cnt ++) { Location prev = history.get(cnt - 1); Location now = history.get(cnt); if (prev != null && now != null) { projection.toPixels(mapFactory.getGeoPointBase((int)(prev.getLatitude() * 1e6), (int)(prev.getLongitude() * 1e6)), historyPointP); projection.toPixels(mapFactory.getGeoPointBase((int)(now.getLatitude() * 1e6), (int)(now.getLongitude() * 1e6)), historyPointN); if ((alphaCnt - cnt) > 0) alpha = Math.round(255 / (alphaCnt - cnt)); else alpha = 255; historyLineShadow.setAlpha(alpha); historyLine.setAlpha(alpha); canvas.drawLine(historyPointP.x, historyPointP.y, historyPointN.x, historyPointN.y, historyLineShadow); canvas.drawLine(historyPointP.x, historyPointP.y, historyPointN.x, historyPointN.y, historyLine); } } } if (size > 0) { Location prev = history.get(size - 1); Location now = coordinates; if (prev != null && now != null) { projection.toPixels(mapFactory.getGeoPointBase((int)(prev.getLatitude() * 1e6), (int)(prev.getLongitude() * 1e6)), historyPointP); projection.toPixels(mapFactory.getGeoPointBase((int)(now.getLatitude() * 1e6), (int)(now.getLongitude() * 1e6)), historyPointN); historyLineShadow.setAlpha(255); historyLine.setAlpha(255); canvas.drawLine(historyPointP.x, historyPointP.y, historyPointN.x, historyPointN.y, historyLineShadow); canvas.drawLine(historyPointP.x, historyPointP.y, historyPointN.x, historyPointN.y, historyLine); } } } if (arrow == null) { arrow = BitmapFactory.decodeResource(settings.getContext().getResources(), R.drawable.my_location_chevron); widthArrow = arrow.getWidth(); heightArrow = arrow.getHeight(); } int marginLeft; int marginTop; marginLeft = center.x - (widthArrow / 2); marginTop = center.y - (heightArrow / 2); canvas.rotate(new Float(heading), center.x, center.y); canvas.drawBitmap(arrow, marginLeft, marginTop, null); canvas.rotate(-(new Float(heading)), center.x, center.y); canvas.setDrawFilter(remfil); //super.draw(canvas, mapView, shadow); } }