如何动态更新特定的overlayitem

时间:2012-07-18 11:19:35

标签: android google-maps location overlay itemizedoverlay

我正在开发一个基于位置的Android应用程序,它处理大量的叠加项目。

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

实施 我有两个叠加。一个用于显示用户位置的MyLocationOverlay,另一个用于显示我需要在地图上显示的所有实体的ItemizedOverlay子类。

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

  1. 当我收到特定实体的位置时,我会从地图中删除所有叠加层并重新添加叠加层。现在使用更新的位置创建其中一个叠加层。

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

  3. 我不知道哪个是性能明智的最佳选择。

    我觉得删除所有重叠并重新添加所有叠加层,当实体数量超过500或1000时,每个单个实体的每个单独位置更新(可能经常)都会成为相当大的开销。

    同时,迭代相同数量的实体也可能是相同的开销。

    任何可供选择的建议或更好的实施方法都将受到赞赏。

    /安迪

3 个答案:

答案 0 :(得分:1)

我认为最佳解决方案(关于性能)是创建一个继承自Overlay类的自定义Overlay类,以便您可以按照自己的方式覆盖onDraw方法。请参阅此previous SO post以了解如何执行此操作。如果您想避免这种情况,可以查看ItemizedOverlay,如果您还没有这样做的话。它比为每个实体创建Overlay更有效,但效率不如第一种方法所建议。

答案 1 :(得分:0)

我遇到了同样的问题,我所做的是你的第一选择。

无论如何,在将它们添加到地图之前,将它们加载到不同的线程上,并且在加载了所有图像和数据之后,将它们添加到主线程上的地图上。

答案 2 :(得分:0)

我建议您将overlayItems存储在HashSet中,并将实体作为键。更新实体后,您可以创建一个新的OverlayItem并将其存储在集合中。因为它是一个集合,旧的OverlayItem将被删除。

要显示OverlayItems,请使用ItemizedOverlay。在ItemizedOverlay.createItem(int position)方法中,您可以获取集合的OverlayItem。 不要忘记使用ItemizedOverlay.getSize()覆盖return set.size()方法。

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

如果您有任何疑问,请查看此Tutorial或发表评论。