2

为了减少处理器在地图上重新绘制路线的工作,我使用 Path 类。我想为一个 ZoomLevel 存储一个路径。我将路径保存在 SparseArray 中,其中 key = ZoomLevel,代码如下所示

    @Override
    public void draw(Canvas canvas, MapView mapView, boolean shadow) {
        if (shadow){
            return;
        }
        else 
            if(route==null){
                return;
            }
            drawPath(mapView, canvas);
    }


    private void drawPath(MapView mv, Canvas canvas) {
        Point point = new Point();

         if (pathMap.get(gMapView.getZoomLevel())==null){           

            List<GeoPoint> list = null;
            Projection p = mv.getProjection();

            List<RouteMachine.Section> routeArray = route.getSections();
            p.toPixels(routeArray.get(0).getPoints().get(0), point);

            Point rememberThisPoint = new Point(point.x,point.y);

            Path path = new Path();
            path.moveTo(point.x,point.y);
            for (RouteMachine.Section section : routeArray) {
                list = section.getPoints();
                for (int i=1; i < list.size(); i++) {
                    p.toPixels(list.get(i), point);
                    path.lineTo(point.x, point.y);
                }
            }
            pathMap.put(gMapView.getZoomLevel(), path, rememberThisPoint);
         }
         else{
            mv.getProjection().toPixels(route.getSections().get(0).getPoints().get(0), point);
            pathMap.offset(gMapView.getZoomLevel(),point);
         }
        canvas.drawPath(pathMap.get(gMapView.getZoomLevel()),mPaint);

        } 

在不同的缩放级别下,它可以工作或不工作。级别更改,但路径看起来像上一个级别的路径。我认为,这是因为 zoomLevel 在映射 rapaints 之前有时会发生变化。路径计算在这两个动作之间起作用。ZoomLewel 已更改,但地图尚未重新绘制。我怎样才能解决这个问题?

4

2 回答 2

1

使用测试缩放级别的问题getZoomLevel()是,在您请求缩放更改后,它会立即开始返回新的缩放级别,但地图图像会经历一个需要一些时间才能完成的渐进式大小更改动画。

但是,getProjection().fromPixels()即使在动画期间,它也会返回正确的投影值,并且可以用于检查动画何时结束。

我使用以下行来测试它:

    pathInitialLonSpan = projection.fromPixels(0,mapView.getHeight()/2).getLongitudeE6() - 
            projection.fromPixels(mapView.getWidth(),mapView.getHeight()/2).getLongitudeE6();

它返回地图中心级别的经度跨度。此值将在缩放更改动画期间更改,并且在 zomm 完成时将保持不变。

我用它来验证动画结束的时间,然后构建路径。

问候。

于 2012-11-14T12:35:56.290 回答
0

如果你使用现成的库,你可以设置最大值,然后你就可以说教了。

看看这个

别的

你可以像这样获得最高级别:

链接 1

链接 2

于 2012-11-14T12:28:38.997 回答