我正在使用 Overlay 来标记 Google Maps 上的区域,方法是绘制我从任何来源获得的一万个 GeoPoints 的形状。这有效,看起来像这样:
@Override
public void draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow) {
super.draw(canvas, mapView, false);
Projection projection = mapView.getProjection();
List<Zone> zones = ApplicationContext.getZones();
path.rewind();
for (Zone zone : zones) {
paint.setDither(true);
paint.setStyle(Style.FILL);
paint.setAlpha(40);
MultiPolygon multiPolygon = zone.getMultiPolygon();
List<Polygon> polygons = multiPolygon.getPolygons();
for (Polygon polygon : polygons) {
for (List<Coordinate> coordinates : polygon.getCoordinates()) {
for (int i = 0; i < coordinates.size(); i++) {
Point p = new Point();
projection.toPixels(new GeoPoint((int)(coordinates.get(i).getLatitude() * 1E6), (int)(coordinates.get(i).getLongitude() * 1E6)), p);
if (i == 0) {
path.moveTo(p.x, p.y);
}
else {
path.lineTo(p.x, p.y);
}
}
}
}
}
canvas.drawPath(path, paint);
}
问题是这非常消耗资源。每次在 MapView 上滚动或移动地图时,都必须一遍又一遍地计算路径,因为像素坐标已经改变。绘制的区域可能变得如此之大,以至于 MapView 上的滚动非常缓慢,以至于无法正常使用。
我的想法是
- 以某种方式缓存路径生成的“形状”,并在 MapView 上的缩放级别更改时重新绘制它。
- 以某种方式在“动态”上绘制绘画 - 位图将其用作叠加层(可能作为 ItemizedOverlay),侦听 MapView 滚动并将位图移动滚动距离。
我不确定是否有更好的方法。
有什么想法可以解决这个问题吗?(我正在使用 Google Maps API 1 并且无法更改)。