放大时,Android MapView叠加层消失

时间:2012-11-22 13:18:44

标签: android google-maps maps overlays

我正在制作一个简单的Android应用,用于在地图上绘制路线。一切进展顺利,但在放大我的三星Galaxy S2时我遇到了一个问题。它在Galaxy S3上工作正常,所以我想知道它是否与较低规格的设备上的内存管理有关。它也可以在模拟器上正常工作。

以下是覆盖onDraw方法的等效代码,只是为了在此处发布而压缩:

Point current = new Point();
Path path = new Path();
Projection projection = mapView.getProjection();

Iterator<GeoPoint> iterator = pointList.iterator();
if (iterator.hasNext()) {
    projection.toPixels(iterator.next(), current);
    path.moveTo((float) current.x, (float) current.y);
} else return path;
while(iterator.hasNext()) {
    projection.toPixels(iterator.next(), current);
    path.lineTo((float) current.x, (float) current.y);
}

Paint roadPaint = new Paint();
roadPaint.setAntiAlias(true);
roadPaint.setStrokeWidth(8.0f);
roadPaint.setColor(Color.BLACK);
roadPaint.setStyle(Paint.Style.STROKE);

canvas.drawPath(path, roadPaint);

与大多数样本代码相比,它并没有太大的不同。我只是想知道是否有人可以证实我的怀疑,并建议我在配置或调整方面是否可以采取任何措施来强制在所有缩放级别进行绘制?

提前致谢。

干杯, 森

2 个答案:

答案 0 :(得分:1)

问题在于您是否正在为地图视图的特定状态绘制叠加层。您应该使用OverlayItem代替。

OverlayItem被添加到MapView覆盖集合中,并且MapView根据它自己的状态(缩放,位置等)处理所有重新绘制

@Override
public void draw( Canvas canvas, MapView mapView, boolean shadow )
{
    super.draw( canvas, mapView, shadow );

    int x1 = -1;
    int y1 = -1;
    int x2 = -1;
    int y2 = -1;

    Paint paint = new Paint();
    paint.setStyle( Paint.Style.STROKE );
    paint.setColor( GeoLocation.ROUTE_COLOR );
    paint.setStrokeWidth( STROKE_WIDTH );

    for ( int i = 0; i < mRouteGeoPoints.size(); i++ )
    {
        Point point = new Point();
        mapView.getProjection().toPixels( geoPoints.get( i ), point );
        x2 = point.x;
        y2 = point.y;
        if ( i > 0 )
        {
            canvas.drawLine( x1, y1, x2, y2, paint );
        }
        x1 = x2;
        y1 = y2;
    }
}

答案 1 :(得分:0)

你说上面的代码是等价的(不是你正在运行的真实代码)而且很明显,因为你在Path中返回了onDraw()对象,你不能。

您展示的代码的“压缩形式”应该与使用drawLine()一样有效。所以问题应该来自别的东西(可能是原始代码)。

无论如何,我会给你一些提示:

  • 当您绘制到画布的对象的顶部和底部都在屏幕外时,该对象将被忽略而不会被绘制。检查这是不是你的路径发生了什么。请参阅此帖Android Map Overlay Disappears on Zoom
  • 中的回答
  • 您不需要每次都重建路径对象。你可能已经在做了,这就是为什么你做了上面的简短版本。请参阅本文中的回答,其中包含一些改进路径绘制的建议:Overlay behavior when zooming
  • 如果由于某种原因你真的想使用较慢的drawLine()方法,你可以使用以下方法使线看起来更好:

    paint = new Paint();
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeJoin(Paint.Join.ROUND);
    paint.setStrokeCap(Paint.Cap.ROUND);
    paint.setColor(...);
    paint.setAlpha(...);
    paint.setStrokeWidth(...);
    

最后,如果问题仍然存在,请使用更相关的代码更新您的问题并告知我们。也许我可以进一步提供帮助。

问候。