2012-11-22 39 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