Overlay.draw()被多次调用。

3
我有一个关于Android Maps中Overlay类的draw()方法的问题。
当我移动地图时,draw()方法会被调用几次(从4到13次)。这对我来说是个问题,因为这个方法必须重新绘制我的70000个+点的路线,这需要大量的资源。
我找不到这个问题的解释,但当我使用任何来源的代码示例时,都会遇到相同的问题。

我认为这不取决于代码。您可以获取任何带有Android Maps的源示例,将断点放入draw()方法中并查看此现象。我可以发送所有我的源代码(包括布局、清单)。我不知道如何将其附加到分支上。 - Konstantin.Efimenko
为了清晰起见,最好将您的“新问题”转移到一个新的问题下面。这样您也会得到更多的答案 :-) - Luis
可能是draw is being constantly called in my android map overlay的重复问题。 - Kristopher Johnson
2个回答

6

这是正常的行为。当你移动地图时,你希望它能平滑移动,并且为了实现这一点,任何地图移动都会被分成较小的移动步骤。

为了保持一致性,在每个小步移动中都会调用覆盖层上的 draw() 方法,因此您可以重新定位覆盖层项以跟随每个步骤。

您可以使用以下方法进行改进:

改进1

对于每个小步,onDraw 会被调用两次。一次参数为 trueshadow,一次参数为 的 shadow。如果您不需要绘制阴影,则可以忽略其中一个调用,从而将开销减少2倍,并将以下内容用作 onDraw() 的第一行:

if(shadow) return;

改进2

优化您绘制路线的方式。如果您正在使用canvas.drawLine(),您可以通过使用canvas.drawPath()来明显改善它。您只需为特定缩放级别创建一条路径,并在地图移动时仅偏移路径而无需重新创建它。

改进3

您甚至可以进一步优化路径,仅添加距离前一个像素较大属性值(即2个像素)的点,从而��少路径中的总点数而不会对质量造成任何可见损失。

我使用上述方法处理具有数千个点(约20,000个)的路线,并且该路线在中等设备中流畅移动。

如果您需要更多详细信息,请告诉我。

祝好运。


嗨@Luis,我也在使用OverlayView,但是即使在其API参考文档中(https://developers.google.com/maps/documentation/javascript/reference?csw=1#OverlayView),我也找不到onDraw()方法。如果可能的话,你能否提供一个例子?谢谢。 - Franva

0

我怀疑你使用了

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

而不是

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

第一个函数用于绘制动画,因此它会被多次调用。
参考:draw is being constantly called in my android map overlay

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