1

我正在开发一个简单的 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);

它与大多数用于执行此操作的示例代码并没有太大的不同。我只是想知道是否有人可以证实我的怀疑并建议我是否可以在配置或调整方面做些什么来强制在所有缩放级别上绘制?

提前致谢。

干杯,内森

4

2 回答 2

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;
    }
}
于 2012-11-22T13:33:55.303 回答
0

您说上面的代码是等效的(不是您正在运行的真实代码),这很清楚,因为您正在返回一个您无法返回的Path对象onDraw()

您显示的代码的“压缩形式”应该与使用drawLine(). 所以问题应该来自其他东西(可能是原始代码)。

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

  • 当您在画布上绘制的对象的顶部和底部都在屏幕之外时,该对象将被忽略且不绘制。检查这是否与您的路径无关。在这篇文章中查看我的答案Android Map Overlay Disappears on Zoom
  • 您不需要每次都重建路径对象。您可能已经这样做了,这就是您制作上述简短版本的原因。请参阅我在这篇文章中的回答以及一些改进路径绘制的建议:缩放时的叠加行为
  • 如果由于某种原因您真的想使用较慢的方法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(...);
    

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

问候。

于 2012-11-23T01:02:48.237 回答