Android 如何动态更新特定的覆盖项

Android 如何动态更新特定的覆盖项,android,google-maps,location,overlay,itemizedoverlay,Android,Google Maps,Location,Overlay,Itemizedoverlay,我正在开发一个基于位置的android应用程序,它可以处理很多重叠项 背景: 我想在地图上显示很多实体。实体的坐标随着其位置的变化而实时变化。对应于更新的位置,实体应在地图上更新。实体可以增长到大量 实施 我有两张套印。一个用于MyLocationOverlay以显示用户位置,另一个用于ItemizedOverlay子类,其中包含我需要在地图上显示的所有实体 问题 无论何时更改实体的位置,都需要更新相应的overlayitem。问题是,我不确定哪种方法是实现这一目标的最佳方法。我有这些选择 当我

我正在开发一个基于位置的android应用程序,它可以处理很多重叠项

背景: 我想在地图上显示很多实体。实体的坐标随着其位置的变化而实时变化。对应于更新的位置,实体应在地图上更新。实体可以增长到大量

实施 我有两张套印。一个用于MyLocationOverlay以显示用户位置,另一个用于ItemizedOverlay子类,其中包含我需要在地图上显示的所有实体

问题 无论何时更改实体的位置,都需要更新相应的overlayitem。问题是,我不确定哪种方法是实现这一目标的最佳方法。我有这些选择

  • 当我收到一个特定实体的位置时,我将从地图中删除所有覆盖并重新添加覆盖。其中一个OverlayItem现在已使用更新的位置创建

    List<Overlay> overlays = map.getOverlays();
    overlays.removeAll(overlays);
    overlays.add(new MyOverlay(marker,this));
    
    List overlays=map.getOverlays();
    覆盖层。移除所有(覆盖层);
    叠加。添加(新的MyOverlay(标记,此));
    
  • 我为每个实体创建一个覆盖。这意味着我将创建500个覆盖图,每个覆盖图只包含一个覆盖项目。我创建了Overlay类的一个子类,并添加了自己的属性,以清楚地标识实体,并为每个实体创建一个属性。当我到达特定实体的位置更新时,我迭代并获取特定的覆盖项,删除它并添加一个具有更新位置的新项

  • List<Overlay> overlays = map.getOverlays();
    overlays.removeAll(overlays);
    overlays.add(new MyOverlay(marker,this));
    
    我不知道哪一个是最好的使用性能明智

    我觉得当实体的数量超过500或1000时,为每个实体的每个位置更新(可能非常频繁)删除所有覆盖并重新添加所有覆盖将成为相当大的开销

    同时,通过相同数量的实体进行迭代的开销也可以相等

    如果您有任何建议,可以选择哪一种或更好的实施方法,我们将不胜感激


    /andy

    我认为最好的解决方案(关于性能)是创建一个从
    Overlay
    类继承的自定义覆盖类,这样您就可以按照自己的方式覆盖
    onDraw
    方法。看看这个,就知道怎么做了。如果您想避免这种情况,您可以检查,如果您还没有这样做。它比为每个实体创建一个
    覆盖图
    更有效,但是没有第一种方法所建议的那么有效。

    我也有同样的问题,我所做的是你的第一选择


    无论如何,在将它们添加到地图中之前,请将它们加载到另一个线程中,在加载完所有图像和数据后,将它们添加到主线程的地图中。

    我建议您将覆盖项存储在哈希集中,并将实体作为键。更新实体后,可以创建新的覆盖项并将其存储在集合中。由于它是一个集合,旧的覆盖项将被删除

    要显示覆盖项,请使用ItemizedOverlay。在
    ItemizedOverlay.createItem(int-position)
    方法中,可以获得集合的覆盖项。 不要忘记用
    返回set.size()
    覆盖
    ItemizedOverlay.getSize()
    方法

    每次更新集合时,在ItemizedOverlay上调用
    populate()


    更多信息请查看此文档,如果您有疑问,请发表评论。

    那么您建议创建一个自定义覆盖类,并在其上绘制所有实体?哪一个会有更好的性能-一个自定义覆盖类,如您所建议的所有500个实体或类似的自定义覆盖类,每个实体一个(将有500个自定义覆盖类对象),我相信没有明确的答案,因为这取决于自定义覆盖类的实现。如果我想确定性能,我会为这两种方法实现一个简单的测试用例,看看哪一种性能最好。