package com.robert.maps.applib.downloader; import org.andnav.osm.util.BoundingBoxE6; import org.andnav.osm.util.GeoPoint; import org.andnav.osm.views.util.Util; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.Path; import android.graphics.Point; import com.robert.maps.applib.R; import com.robert.maps.applib.view.TileView; import com.robert.maps.applib.view.TileViewOverlay; public class DownloadedAreaOverlay extends TileViewOverlay { private GeoPoint mPoint[]; private GeoPoint mBasePoint[]; private int X, Y, Z; private Paint mPaint = new Paint(); private Paint mPaintFill = new Paint(); private com.robert.maps.applib.view.TileView.OpenStreetMapViewProjection mProj; public void Init(Context ctx, int lat0, int lon0, int lat1, int lon1) { mBasePoint = new GeoPoint[2]; mBasePoint[0] = new GeoPoint(lat0, lon0); mBasePoint[1] = new GeoPoint(lat1, lon1); mPaint.setColor(ctx.getResources().getColor(R.color.download_area)); mPaint.setStyle(Style.STROKE); mPaint.setStrokeWidth(3); mPaint.setAntiAlias(true); mPaint.setAlpha(180); mPaint.setStrokeCap(Paint.Cap.ROUND); mPaint.setShadowLayer(10.0f, 0, 0, ctx.getResources().getColor(R.color.download_area)); mPaintFill.setColor(ctx.getResources().getColor(R.color.download_area)); mPaintFill.setStyle(Style.FILL); mPaintFill.setAntiAlias(true); mPaintFill.setAlpha(80); } public void setLastDowloadedTile(int x, int y, int z, TileView tileView) { if(Z != z && z >= 0) { if(mProj == null) mProj = tileView.getProjection(); final int[] tile0 = Util.getMapTileFromCoordinates(mBasePoint[0].getLatitudeE6(), mBasePoint[0].getLongitudeE6(), z, null, tileView.getTileSource().PROJECTION); final int[] tile1 = Util.getMapTileFromCoordinates(mBasePoint[1].getLatitudeE6(), mBasePoint[1].getLongitudeE6(), z, null, tileView.getTileSource().PROJECTION); final BoundingBoxE6 bb0 = Util.getBoundingBoxFromMapTile(tile0, z, tileView.getTileSource().PROJECTION); final BoundingBoxE6 bb1 = Util.getBoundingBoxFromMapTile(tile1, z, tileView.getTileSource().PROJECTION); mPoint = new GeoPoint[2]; mPoint[0] = new GeoPoint(bb0.getLatNorthE6(), bb0.getLonWestE6()); mPoint[1] = new GeoPoint(bb1.getLatSouthE6(), bb1.getLonEastE6()); } if(z > Z) { X = x; Y = y; Z = z; } else if(y > Y) { X = x; Y = y; } else if(x > X) { X = x; } } @Override protected void onDraw(Canvas c, TileView tileView) { if(mPoint == null || mProj == null) return; mProj = tileView.getProjection(); final Point p0 = mProj.toPixels(mPoint[0], null); final Point p1 = mProj.toPixels(mPoint[1], null); final int[] tileCoord = {Y, X}; final BoundingBoxE6 bb = Util.getBoundingBoxFromMapTile(tileCoord, Z, tileView.getTileSource().PROJECTION); final Point p2 = mProj.toPixels(new GeoPoint(bb.getLatNorthE6(), bb.getLonWestE6()), null); final Point p3 = mProj.toPixels(new GeoPoint(bb.getLatSouthE6(), bb.getLonEastE6()), null); final Path path = new Path(); path.moveTo(p1.x, p1.y); if(p1.x == p3.x && p1.y != p3.y) { path.lineTo(p1.x, p3.y); path.lineTo(p0.x, p3.y); path.lineTo(p0.x, p1.y); } else { path.lineTo(p1.x, p2.y); if(p1.y == p3.y) { path.lineTo(p3.x, p2.y); path.lineTo(p2.x, p2.y); path.lineTo(p2.x, p1.y); } else { path.lineTo(p3.x, p2.y); path.lineTo(p3.x, p3.y); path.lineTo(p0.x, p3.y); path.lineTo(p0.x, p1.y); } } path.close(); c.drawPath(path, mPaintFill); c.drawPath(path, mPaint); } @Override protected void onDrawFinished(Canvas c, TileView tileView) { // TODO Auto-generated method stub } public void downloadDone() { mPoint = null; } }