package net.osmand.plus.views; 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.PointF; import android.graphics.RectF; import android.graphics.Paint.Cap; import android.graphics.Paint.Join; import android.graphics.Paint.Style; import android.location.Location; public class GPXLayer implements OsmandMapLayer { private OsmandMapTileView view; private List<List<Location>> points = new ArrayList<List<Location>>(); private Paint paint; private Path path; public GPXLayer(){ } private void initUI() { paint = new Paint(); paint.setColor(Color.argb(180, 160, 10, 215)); paint.setStyle(Style.STROKE); paint.setStrokeWidth(14); 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) { if(points.isEmpty()){ return; } for (List<Location> l : points) { path.rewind(); int startIndex = -1; for (int i = 0; i < l.size(); i++) { Location ls = l.get(i); if (startIndex == -1) { if (ls.getLatitude() >= latLonBounds.bottom && ls.getLatitude() <= latLonBounds.top && ls.getLongitude() >= latLonBounds.left && ls.getLongitude() <= latLonBounds.right ) { startIndex = i > 0 ? i - 1 : i; } } else if (!(latLonBounds.left <= ls.getLongitude() + 0.03 && ls.getLongitude() - 0.03 <= latLonBounds.right && latLonBounds.bottom <= ls.getLatitude() + 0.03 && ls.getLatitude() - 0.03 <= latLonBounds.top)) { drawSegment(canvas, l, startIndex, i); // do not continue make method more efficient (because it calls in UI thread) // this break also has logical sense ! // break; startIndex = -1; } } if (startIndex != -1) { drawSegment(canvas, l, startIndex, l.size() - 1); continue; } } } private void drawSegment(Canvas canvas, List<Location> l, int startIndex, int endIndex) { int px = view.getMapXForPoint(l.get(startIndex).getLongitude()); int py = view.getMapYForPoint(l.get(startIndex).getLatitude()); path.moveTo(px, py); for (int i = startIndex + 1; i <= endIndex; i++) { Location p = l.get(i); int x = view.getMapXForPoint(p.getLongitude()); int y = view.getMapYForPoint(p.getLatitude()); path.lineTo(x, y); } canvas.drawPath(path, paint); } public boolean isVisible(){ return !points.isEmpty(); } public void clearCurrentGPX(){ points.clear(); } public void setTracks(List<List<Location>> tracks){ if(tracks == null){ clearCurrentGPX(); } else { points = tracks; } } @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; } }