尽管您已经接受了答案,但我使用的方法如下。在下面的示例代码中,我使用的是 old MapView
,但这个概念应该适用于任何版本。我也将它与mapforges
(最小调整)一起使用。
概念
path
在第一次通话时建立你draw()
,并记录点的位置(0)
- 在下一个
draw()
如果点(0)位置改变,地图已经移动。在绘制之前将“路径”偏移相同的值。
- 如果缩放改变,重新创建
path
对象。
表现
在中型设备中使用 10.000 点路径,2 ms
每次缓存draw()
调用大约需要。当需要重建路径时(当缩放改变时)大约需要80 ms
.
当然,您还可以缓存不同的路径缩放级别,用更多的内存换取更多的性能。
示例代码
draw() 方法仅检查是否有缩放变化(如果是,则要求重建路径)以及地图是否已移动(如果是偏移路径)并最终绘制路径。
@Override
public void draw(Canvas canvas, MapView mapview, boolean shadow) {
super.draw(canvas, mapview, shadow);
if(shadow) return;
if(mp.getPoints() == null || mp.getPoints().size() < 2) return;
Projection projection = mapview.getProjection();
int lonSpanNew = projection.fromPixels(0,mapview.getHeight()/2).getLongitudeE6() -
projection.fromPixels(mapview.getWidth(),mapview.getHeight()/2).getLongitudeE6();
if(lonSpanNew != pathInitialLonSpan)
pathBuild();
else{ //check if path need to be offset
projection.toPixels(mp.getPoints().get(0), p1);
if(p1.x != pathInitialPoint.x || p1.y != pathInitialPoint.y){
path.offset(p1.x - pathInitialPoint.x, p1.y - pathInitialPoint.y);
pathInitialPoint.x = p1.x;
pathInitialPoint.y = p1.y;
}
}
canvas.drawPath(path, paint);
}
每次缩放更改时都必须构建路径。缩放变化检测是使用 pathInitialLonSpan 完成的,因为 getZoomLevel() 与地图缩放动画不同步。
private void pathBuild(){
path.rewind();
if(mp.getPoints() == null || mp.getPoints().size() < 2) return;
Projection projection = mapView.getProjection();
pathInitialLonSpan = projection.fromPixels(0,mapView.getHeight()/2).getLongitudeE6() -
projection.fromPixels(mapView.getWidth(),mapView.getHeight()/2).getLongitudeE6();
projection.toPixels(mp.getPoints().get(0), pathInitialPoint);
path.moveTo(pathInitialPoint.x,pathInitialPoint.y);
for(int i=1; i<mp.getPoints().size(); i++){
projection.toPixels(mp.getPoints().get(i), p1);
int distance2 = (pPrev.x - p1.x) * (pPrev.x - p1.x) + (pPrev.y - p1.y) * (pPrev.y - p1.y);
if(distance2 > 9){
path.lineTo(p1.x,p1.y);
pPrev.set(p1.x, p1.y);
}
}
问候。