Android中更高效的地图叠加层

时间:2009-11-02 21:56:30

标签: android overlay android-mapview

在我的应用程序中,我在MapView之上绘制公交路线。这些路线有十几个和几百个GPS坐标,描述了公交车的路线。

Hosted by imgur.com

我遇到的问题是,一旦我绘制出所有这些平移/缩放行,MapView非常慢(甚至点击“后退”按钮需要一分钟时间)。

我不确定它有多相关,但是我输入了一些调试代码,然后检查了logcat输出,MapView重复调用了Overlaydraw()方法任何事情都发生了变化。这种情况每秒发生几次,导致大量垃圾收集(每秒2-3 MB)。

有没有人对某种尝试加快速度的方法有什么想法/建议?

2 个答案:

答案 0 :(得分:5)

我只使用了ItemizedOverlay,而不是Overlay,所以这些建议都是纯粹的推测。哎呀,我甚至没有做过2D图形API。

显然,最好的答案是让它一直停止呼叫draw()。尝试记录一些堆栈跟踪,看看是否可以找出触发所有draw()调用的内容。例如,最近在Android Google Groups中,有人注意到Chronometer会导致同一UI中的小部件每秒重绘一次。虽然我可以看到您没有Chronometer,但您可以找出可以纠正的draw()来电的一些根本原因。

假设没有帮助,我猜测“是否有任何改变”的测试是getLatitudeSpan()getLongitudeSpan()getZoomLevel()和其他{{}}的组合。 {1}}方法。并且,我假设您在每个MapView上迭代GPS点并绘制路线。如果是这样,你可以尝试:

  1. 当你真的画画时,首先画一个由draw()支持的Canvas,然后将Bitmap应用于Bitmap Canvas draw() },并缓存Bitmap
  2. 跟踪上一个draw()中使用的值组合,如果下一个draw()相同,则只需重复使用现有的Bitmap。否则,请转到步骤#1,确保释放位图(或重用它,如果可能的话)。
  3. 我猜测,通过图形加速,将Bitmap爆炸到Canvas比在坐标和绘制线上迭代更便宜。并且,通过缓存Bitmap,您将节省垃圾生成。

    无论如何,只是一个想法。

答案 1 :(得分:1)

覆盖类中有两种绘制方法。一个有3个参数,一个有4个参数。您必须使用3个参数覆盖draw方法。 用4个参数覆盖该方法将减慢您的应用程序。这正是我发生的事情。看来,互联网上的例子在哪里有相同的错误。