0

如果有人对实现代码以设置地图标记图标的最有效方法有任何建议,那将非常有帮助:

  • 用户定义的过滤器指定要显示的标记(boolean
  • 包含在HashMap<String, Integer>与标记相关联的键 - inclass CrimePoint

过滤器用户定义的选项:

    boolean displayAntiSocialBehaviourMarkers;
    boolean displayBurglaryMarkers;
    boolean displayCriminalDamageArsonMarkers;
    boolean displayDrugsMarkers;
    boolean displayOtherTheftMarkers;
    boolean displayPubDisorderWeaponsMarkers;
    boolean displayRobberyMarkers;
    boolean displayShopliftingMarkers;
    boolean displayVehicleCrimeMarkers;
    boolean displayViolentCrimeMarkers;
    boolean displayOtherCrimeMarkers;

每个标记都是用CrimePoint一个类创建的,该类包含绘制标记所需的所有信息

犯罪点类变量:

private final Double latitude;
private final Double longitude;
private final String title;

//SNIPPET
//The HashMap storing the categories associated with this CrimePoint.
//Category name is the key and the number of crimes in that category is the Value
//
private Map<String, Integer> crimeCategories;

//An integer to hold the references to the icon image to use
//Example: R.drawable.image002;
private int iconResource;

标记图标:

地图有12 个不同的标记图标。每个过滤器选项一个 [如上所示] 和一个特殊情况标记(多重犯罪),其中:
-CrimePoint具有多个犯罪类别 ( crimeCategories.size() > 1)并且
- 包含在其中的多个犯罪类别CrimePoint使用过滤器选项设置为可见

仅当显示一个(或多个)犯罪类别时才会绘制标记。

任何帮助或建议都会很棒,因为我花了很长时间来处理我需要的逻辑并且没有想出太多。

注意:每次用户更改过滤器选项时,都需要调用此函数来更改地图上的图标和隐藏/显示标记。

4

1 回答 1

0

首先,你应该考虑改变你的表现。从列举犯罪类型开始:

enum CrimeType { AntiSocialBehaviour, ..., Count }

现在您的标志可以创建为枚举集:

EnumSet<CrimeType> showMarkers = new EnumSet<CrimeType>();

这就像普通的 Java 一样工作,Set但效率更高。如果不需要散列的力量,请在标记中使用它们而不是散列。

要打开和关闭标记,请注意文档中的可见性属性。更改过滤器标志时,遍历标记列表以适当地设置可见性。然后使地图片段或视图无效。绘制时间将支配可见性设置时间,因此这是尽可能高效的。

我推断您对效率的问题有很多标记。如果您有太多标记以致地图因重叠而变得混乱,那么您必须实施一种合并算法来用一个表示多个标记。我早些时候在这个主题上发布了这个问题,但没有收到任何回复。我的解决方案在那里解释得很好,虽然没有我想要的那么快(2-3 秒,Nexus 平板电脑上有大约 15,000 个标记)。

对于非标准标记外观,请研究“更改默认标记”下的文档

这很清楚。如果您有具体问题并显示代码,我们可以提供详细信息。

于 2013-03-11T20:21:35.150 回答