我正在尝试在我的 MapView 上绘制路线。我扩展了 Overlay 并实现了 draw() 方法。路线显示正确,虽然在调试时,我在 draw() 上添加了一个断点,并注意到它被不断调用。
我只希望在有人移动地图或缩放时重新绘制它(绘制路线时绘制考虑了这些变化)可能导致这种情况?
我正在尝试在我的 MapView 上绘制路线。我扩展了 Overlay 并实现了 draw() 方法。路线显示正确,虽然在调试时,我在 draw() 上添加了一个断点,并注意到它被不断调用。
我只希望在有人移动地图或缩放时重新绘制它(绘制路线时绘制考虑了这些变化)可能导致这种情况?
有两种绘制方法可以被覆盖。
void draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow)
描述:在地图上绘制叠加层。
boolean draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow, long when)
描述: 动画覆盖的绘制调用。
我最初覆盖了第二个。
改成第一种方法后,就成功了。
我认为 draw 方法被反复调用,因为背景不断被重绘。尝试将“MapView.ReticleDrawMode”设置为 DRAW_RETICLE_UNDER。这基本上告诉 mapView 在叠加层下绘制标线。所以调用背景时不会调用overlay的draw方法。这为我解决了这个问题。
欲了解更多信息,请看这里:MapView Api
当我没有意识到 draw 方法 get 不仅调用了您绘制的任何标记,而且还调用了这些标记的阴影时,我被绊倒了。例如,如果您有两个标记并且阴影设置为 true(这是默认设置),那么您将调用 draw 方法 4 次(每个标记一次,标记的每个阴影一次)!
经过进一步审查,Overlay draw() 确实按照文档中的描述工作。shadow = true 绘制一次,shadow = false 绘制一次。
有趣的是,特定的叠加层 draw() 方法响应为在 MapView 中绘制的每个元素的广告。例如,在我的例子中,它似乎对每个谷歌地图、在地图上绘制的谷歌徽标以及我自己绘制的特定叠加层做出响应。显然每个两次(阴影真|假)。
这可能是渲染地图的预期方式。我没有找到或花费足够的时间来研究这些信息。
此外,在我自己的情况下,我在地图上呈现了一个透明面板,其中包含 CheckBox(s) 和 TextView 小部件。TextView 强制 draw() 方法不间断地运行,因为 textview 始终在侦听输入并因此触发覆盖的重绘。
对我来说,它看起来像一个奇怪的错误 - 有时 draw 方法被连续调用,有时不是。
看这里。
在我的应用程序中,当我为地图加载网络数据时,会显示一个不确定的进度条(例如旋转圆圈)。网络数据加载完成后,我将进度条的可见性设置为不可见。但是,这导致地图不断重绘,因为似乎在地图上发生的任何动画(我猜)都会导致地图本身重绘。对此的简单解决方案是将可见性设置为消失。例如改变这个:
ProgressBar loadingIcon = (ProgressBar) findViewById(R.id.loadingIcon);
...
//Network data now finished loading...
loadingIcon.setVisibility(View.INVISIBLE);
对此:
loadingIcon.setVisibility(View.GONE);
它将它完全从地图中删除,不再对其进行动画处理,因此不会导致 draw() 被无限期地调用。
我知道这是一个老问题,但我现在才遇到它。这是一篇“物有所值”的帖子。
绘制循环原来是我的一个编码错误。根据文档,如果绘图例程返回 true,则它要求立即更新。如果返回 false,则每个叠加层只进行两次传递;一个代表影子真,一个代表影子假。我返回 true 导致不断更新。在我更改为返回 false 后,每个叠加层只发生了两次传递。没有循环。
您可以简单地将其添加到您的 ItemizedOverlay 类:
@Override public void draw( Canvas c, MapView m, boolean shadow ) { super.draw( c, m, false );}
这将从您的地图视图叠加层中移除阴影。