在我的android地图叠加层中不断调用draw

时间:2010-05-07 23:35:06

标签: android overlay android-mapview

我正在尝试在MapView上绘制路线。 我已经扩展了Overlay并实现了draw()方法。 路由显示正常,但在调试时, 我在draw()上添加了一个断点,并注意到它被不断调用。

我只希望在有人移动地图或缩放时重新绘制(绘制时会考虑这些变化) 是什么导致这种情况?

8 个答案:

答案 0 :(得分:13)

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

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

描述:在地图上绘制叠加层。

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

我最初压倒了第二个 在改用第一种方法之后,它就成功了。

答案 1 :(得分:2)

我认为draw方法是重复调用的,因为背景会不断重绘。尝试将“MapView.ReticleDrawMode”设置为DRAW_RETICLE_UNDER。这基本上告诉mapView在叠加层下绘制十字线。因此,在调用背景时不会调用overlay的draw方法。这为我解决了这个问题。

了解更多信息,请点击此处:MapView Api

答案 2 :(得分:2)

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

答案 3 :(得分:2)

经过进一步审查后,Overlay draw()确实按照文档中的描述工作。阴影= true的一次绘制,shadow = false的一次绘制。

有趣的是,特定的overlay draw()方法响应广告为MapView中绘制的每个元素。例如,在我的情况下,它似乎响应每个谷歌地图,在地图上绘制的谷歌徽标,然后我自己绘制的特定叠加。显然每次两次(shadow true | false)。

这可能是渲染地图的预期方式。我没有找到或花费足够的时间研究这些信息。

另外,在我自己的情况下,我在我的地图上使用CheckBox和TextView小部件渲染了透明面板。 TextView强制draw()方法不间断运行,因为textview始终监听输入,因此触发重叠的重绘。

答案 4 :(得分:1)

对我而言,它看起来像一个奇怪的错误 - 有时候连续调用draw方法,有时不会。

请参阅here

答案 5 :(得分:1)

在我的应用中,当我正在加载地图的网络数据时,我有一个无限期的进度条(例如旋转圆圈)。当网络数据加载完毕后,我将进度条的可见性设置为不可见。然而,这导致地图不断重绘,因为似乎任何在地图上发生的动画(我猜)都会导致地图本身重绘。对此的简单解决方案是将可见性设置为相反。例如。改变这个:

ProgressBar loadingIcon = (ProgressBar) findViewById(R.id.loadingIcon);
...
//Network data now finished loading...
loadingIcon.setVisibility(View.INVISIBLE);

到此:

loadingIcon.setVisibility(View.GONE);

将其从地图中完全删除,不再对其进行动画处理,因此不会导致无限期地调用draw()。

答案 6 :(得分:0)

我知道这是一个老问题,但我刚刚遇到它。这是一个“为了它的价值”的帖子。

绘制循环结果证明是我的编码错误。根据文档,如果绘制例程返回true,则要求立即更新。如果返回false,则每个叠加只进行两次传递;一个用于阴影true,一个用于阴影false。我返回true,导致不断更新。在我改为返回false之后,每个叠加只发生两次。没有循环。

答案 7 :(得分:-1)

您只需将其添加到ItemizedOverlay类:

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

这将删除mapview叠加层中的阴影。