2012-11-22 40 views
1

我正在研究一个简单的Android应用程序,用于绘制地图上的路线。一切进展顺利,但放大我的三星Galaxy S2时遇到了问题。它在Galaxy S3上运行良好,所以我想知道它是否与低配置设备上的内存管理有关。它也可以在模拟器上正常工作。Android MapView叠加在放大时消失

这里是等效代码坐落在覆盖的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); 

这不是太不相似的大部分示例代码左右浮动这样做的。我只是想知道是否有人可以证实我的怀疑,并建议我可以做什么配置或调整,我可以做的任何事情来强制绘制在所有缩放级别?

在此先感谢。

干杯, 弥敦道

回答

0

你说上面的代码是等效的重画(而不是你正在运行的真实代码),这很明显,因为你正在返回一个Path对象在onDraw(),你不能。

您显示的代码的“压缩格式”应该可以正常工作,也可以使用drawLine()。所以这个问题应该来自别的东西(可能是原始代码)。

无论如何,我给你一对夫妇的提示:

  • 当对象的你是画在画布的顶部和底部都出入画面时,物体会被忽略,而不是绘制。检查这是不是你的路径发生了什么。看到我在这篇文章中的回答Android Map Overlay Disappears on Zoom
  • 你不需要每次都重建路径对象。你可能已经在做这件事了,这就是为什么你做了上面的短版本。见我的答案在这篇文章中的一些建议,以改善路径图中:Overlay behavior when zooming
  • 如果由于某种原因,你真的想用的drawLine()较慢的方法,你可以使用follwing使线更好看:

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

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

问候。

+0

是的,这个函数被分成了一大堆封装每一步的方法。非常适合在IDE中阅读,但过于冗长而无法发布。 我确实有一个缓存路径并翻译它的版本,但是我已经删除它,直到我找出它为什么会消失。我怀疑这是与你的矩形发现的路径的顶部和底部。 setStrokeJoin和setStrokeCap可能是一个很好的后备。有趣的是你提到它比较慢,它比我当前的路径实现方式快得多,只是更加丑陋。 干杯,弥敦道 – thenathanjones

+0

你击中了头部。一旦路径的顶部和底部离开屏幕,路径就不会被绘制。线条解决方案不会发生这种情况,因为它始终在屏幕上。现在决定如何处理它。 – thenathanjones

+0

仍然没有解释为什么只发生在我的设备上,而不是仿真器或Galaxy S3上。 – thenathanjones

1

的问题是,你是你自己画的覆盖了的MapView的一个非常特殊的状态。您应该改用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; 
    } 
} 
+0

OverlayItem是否不用于位于某一点的奇异物品?我读过的所有文档都表示路径需要由扩展Overlay的类绘制。 – thenathanjones

+0

没错。所以你的代码实际上是在Overlay子类的onDraw上执行的? –

+0

这是正确的。正如我所说,在功能上它似乎工作正常,仿真器和GS3工作正常。我确实在同一部手机上有其他应用程序没有这个问题,所以我只是想知道是否有一些我想念的魔法:) – thenathanjones