我的安卓地图叠加层中不断调用了draw方法。

12

我正在尝试在我的MapView上绘制路线。 我扩展了Overlay并实现了draw()方法。 该路线被正确显示,但是在调试时, 我在draw()上设置了断点,并注意到它会不断地被调用。

我只想在有人移动地图或缩放时重新绘制它(绘制考虑这些变化)。 这可能是什么原因导致的?

8个回答

13

有两种可以覆盖的绘制方法。

void draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow)

描述:绘制地图覆盖层。

boolean draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow, long when)
描述:用于动画覆盖层的绘制调用。

我最初重写了第二个方法。
在改为使用第一个方法后,它成功了。


2
我认为draw方法会被重复调用,因为背景不断重新绘制。尝试将"MapView.ReticleDrawMode"设置为DRAW_RETICLE_UNDER。这基本上告诉mapView在覆盖层下面绘制准星。因此,当重新调用背景时,不会调用覆盖层的draw方法。这对我解决了问题。
更多信息请参见:MapView Api

2

当我没有意识到绘制方法不仅适用于任何你绘制的标记,还适用于这些标记的阴影时,我就被绊倒了。例如,如果你有两个标记,并且将阴影设置为true(默认设置),那么绘制方法将被调用4次(每个标记一次,每个标记的阴影一次)!


2
经过进一步的审查,Overlay draw() 方法实际上与文档描述的一样有效。当 shadow = true 时绘制一次,当 shadow = false 时再绘制一次。
有趣的是,特定的覆盖层 draw() 方法对 MapView 中绘制的每个元素都有响应。例如,在我的情况下,它似乎分别对谷歌地图、在地图上绘制的 Google 标志以及我自己绘制的特定覆盖层进行响应。显然,每个元素都会绘制两次 (shadow true|false)。
这可能是呈现地图的预期方式。我还没有找到或花足够的时间研究这些信息。
此外,在我自己的情况下,我在地图上渲染了一个透明面板,其中包含 CheckBox 和 TextView 组件。TextView 强制 draw() 方法不停运行,因为 TextView 始终在侦听输入,从而触发覆盖层的重新绘制。

1
在我的应用程序中,当我正在加载地图的网络数据时,我有一个不确定的进度条(例如旋转圆圈)显示。当网络数据加载完成时,我将进度条的可见性设置为不可见。然而,这会导致地图不断重绘,因为似乎任何发生在地图上的动画(我猜测)都会导致地图本身重新绘制。解决这个简单的问题是将可见性设置为gone。例如,将此更改为:
ProgressBar loadingIcon = (ProgressBar) findViewById(R.id.loadingIcon);
...
//Network data now finished loading...
loadingIcon.setVisibility(View.INVISIBLE);

转换为:

loadingIcon.setVisibility(View.GONE);

这将完全从地图中移除它,不再在其上进行动画处理,因此也不会无限调用draw()。


非常感谢您发布这篇文章——您刚刚解决了一个让我疯狂的问题。 - John R.B. Palmer

1
对我来说,它看起来像一个奇怪的错误 - 有时候绘制方法会连续调用,有时候不会。
请参阅此处

0

我知道这是一个老问题,但我刚遇到。这是一篇“值得一提”的帖子。

绘制循环最终证明是我的编码错误。根据文档,如果绘制例程返回true,则正在请求立即更新。如果返回false,则每个覆盖层只进行两次传递;一次为阴影为true,一次为阴影为false。我返回了true,结果导致不断更新。当我改为返回false时,每个覆盖层仅出现了两次传递。没有循环。


-1

你可以简单地将以下代码添加到你的 ItemizedOverlay 类中:

@Override public void draw( Canvas c, MapView m, boolean shadow ) { super.draw( c, m, false );}

这将从您的地图叠加层中移除阴影。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接