@Override public void onMapChanged() { List<TrackPoint> trackpoints = track.getPoints(); synchronized (trackpoints) { for (TrackPoint tp : trackpoints) { tp.dirty = true; } } }
@Override protected void onDraw(final Canvas c, final MapView mapView, int centerX, int centerY) { if (!track.show) return; Androzic application = (Androzic) context.getApplication(); final int[] cxy = mapView.mapCenterXY; int w2 = mapView.getWidth() / 2; int h2 = mapView.getHeight() / 2; int left = cxy[0] - w2; int right = cxy[0] + w2; int top = cxy[1] - h2; int bottom = cxy[1] + h2; final Path path = new Path(); boolean first = true; boolean skipped = false; int lastX = 0, lastY = 0; List<TrackPoint> trackpoints = track.getPoints(); synchronized (trackpoints) { for (TrackPoint tp : trackpoints) { int[] xy = new int[2]; if (tp.dirty) { xy = application.getXYbyLatLon(tp.latitude, tp.longitude); tp.x = xy[0]; tp.y = xy[1]; tp.dirty = false; } else { xy[0] = tp.x; xy[1] = tp.y; } if (first) { path.setLastPoint(xy[0] - cxy[0], xy[1] - cxy[1]); lastX = xy[0]; lastY = xy[1]; first = false; continue; } if ((lastX == xy[0] && lastY == xy[1]) || lastX < left && cxy[0] < left || lastX > right && cxy[0] > right || lastY < top && cxy[1] < top || lastY > bottom && cxy[1] > bottom) { lastX = xy[0]; lastY = xy[1]; skipped = true; continue; } if (skipped) { path.moveTo(lastX - cxy[0], lastY - cxy[1]); skipped = false; } if (tp.continous) path.lineTo(xy[0] - cxy[0], xy[1] - cxy[1]); else path.moveTo(xy[0] - cxy[0], xy[1] - cxy[1]); lastX = xy[0]; lastY = xy[1]; } } c.drawPath(path, paint); }