package net.osmand.plus.views; import java.util.ArrayList; import java.util.List; import net.osmand.LogUtil; import net.osmand.osm.MapUtils; import net.osmand.plus.activities.RoutingHelper; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PointF; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Paint.Cap; import android.graphics.Paint.Join; import android.graphics.Paint.Style; import android.location.Location; import android.util.Log; public class RouteLayer implements OsmandMapLayer { private OsmandMapTileView view; private final RoutingHelper helper; private Rect boundsRect; private RectF tileRect; private List<Location> points = new ArrayList<Location>(); private Paint paint; private Path path; public RouteLayer(RoutingHelper helper){ this.helper = helper; } private void initUI() { boundsRect = new Rect(0, 0, view.getWidth(), view.getHeight()); tileRect = new RectF(); paint = new Paint(); paint.setColor(Color.BLUE); paint.setStyle(Style.STROKE); paint.setStrokeWidth(14); paint.setAlpha(100); paint.setAntiAlias(true); paint.setStrokeCap(Cap.ROUND); paint.setStrokeJoin(Join.ROUND); path = new Path(); } public void initLayer(OsmandMapTileView view) { this.view = view; initUI(); } @Override public void onDraw(Canvas canvas, RectF latLonBounds, boolean nightMode) { path.reset(); if (helper.hasPointsToShow()) { long time = System.currentTimeMillis(); int w = view.getWidth(); int h = view.getHeight(); if(helper.getCurrentLocation() != null && view.isPointOnTheRotatedMap(helper.getCurrentLocation().getLatitude(), helper.getCurrentLocation().getLongitude())){ boundsRect = new Rect(-w / 2, -h, 3 * w / 2, h); } else { boundsRect = new Rect(0, 0, w, h); } view.calculateTileRectangle(boundsRect, view.getCenterPointX(), view.getCenterPointY(), view.getXTile(), view.getYTile(), tileRect); double topLatitude = MapUtils.getLatitudeFromTile(view.getZoom(), tileRect.top); double leftLongitude = MapUtils.getLongitudeFromTile(view.getZoom(), tileRect.left); double bottomLatitude = MapUtils.getLatitudeFromTile(view.getZoom(), tileRect.bottom); double rightLongitude = MapUtils.getLongitudeFromTile(view.getZoom(), tileRect.right); double lat = topLatitude - bottomLatitude + 0.1; double lon = rightLongitude - leftLongitude + 0.1; helper.fillLocationsToShow(topLatitude + lat, leftLongitude - lon, bottomLatitude - lat, rightLongitude + lon, points); if((System.currentTimeMillis() - time) > 80){ Log.e(LogUtil.TAG, "Calculate route layer " + (System.currentTimeMillis() - time)); //$NON-NLS-1$ } if (points.size() > 0) { int px = view.getMapXForPoint(points.get(0).getLongitude()); int py = view.getMapYForPoint(points.get(0).getLatitude()); path.moveTo(px, py); for (int i = 1; i < points.size(); i++) { Location o = points.get(i); int x = view.getMapXForPoint(o.getLongitude()); int y = view.getMapYForPoint(o.getLatitude()); // if (i == 1) { // pathBearing = (float) (Math.atan2(y - py, x - px) / Math.PI * 180); // } path.lineTo(x, y); } canvas.drawPath(path, paint); } } } public RoutingHelper getHelper() { return helper; } // to show further direction public Path getPath() { return path; } @Override public void destroyLayer() { } @Override public boolean drawInScreenPixels() { return false; } @Override public boolean onLongPressEvent(PointF point) { return false; } @Override public boolean onTouchEvent(PointF point) { return false; } }