3

我正在尝试在 android 中的 Google Map v2 上画一个圆圈,一旦位置发生变化,中心就是当前位置。现在我看到的是,每次更改位置时,都会不断绘制圆圈(如果位置相同,则相互重叠)而不删除前一个圆圈。Marker 也发生了同样的事情。

下面是我用来在 Google Map v2 上绘制圆圈的代码

@Override
public void onLocationChanged(Location location) {
    if (location != null) {

    // Create a LatLng object for the current location
    LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());

    // Show the current location in Google Map
    map.moveCamera(CameraUpdateFactory.newLatLng(latLng));

    // Zoom in the Google Map
    map.animateCamera(CameraUpdateFactory.zoomTo(14));

    CircleOptions circleOptions = new CircleOptions().center(latLng) // set center
    .radius(1000) // set radius in meters
    .fillColor(Color.TRANSPARENT) // default
    .strokeColor(0x10000000).strokeWidth(5);

    myCircle = map.addCircle(circleOptions);

    map.addMarker(new MarkerOptions().position(latLng).title("You are here!"));
}

我如何确保下次绘制圆圈时,会从 Google 地图中清除之前的圆圈和标记。我需要对我的代码进行哪些更改?

任何帮助将不胜感激。

4

3 回答 3

3

从地图中删除东西很简单。无论出于何种原因,在GoogleMapsv2 中,您不能简单地Marker通过获取其 id 来删除 a,因为该值是在创建时自动生成的,因此几乎没有用。要解决此问题,您需要做的就是创建一些可以存储对要删除的对象的引用的东西。一种方法是创建HashMap并存储对您的Marker、圈子或您希望能够删除的任何其他内容的引用,并带有一些唯一的 id。通过将对您放置在地图上的事物的引用存储在 aHashMap中,然后您可以在每次更新位置时调用与该键关联的标记上的 remove。圆圈也是如此(尽管您需要不同的HashMap如果您按照我在下面设置的类型 - 我不知道您是否可以使用通用的字符串,对象映射将存储两者)。

要使用此方法,请将您的HashMaplike 声明为一个实例变量,以便可以从您的所有方法中访问它Activity

private HashMap<String, Marker> mapStuff = new HashMap<String, Marker>();

然后无论您在哪里创建您的Marker或其他地图对象,只需将它们添加到HashMap带有一些键值的

Marker dude = map.addMarker(new MarkerOptions()
.position(newLatLng(latitude, longitude))
.title(MARKER_TITLE)
.snippet(SNIPPET));
mapStuff.put("userMarker", dude);

这个概念实际上与另一张海报所建议的相同,只是将 aMarker作为实例变量并在那里存储引用。两者都做同样的事情。HashMap如果您要处理多个标记或对象,该方法效果最好。如果您只处理一个Marker或一个圆圈,则单变量方法可能更正确,因为您不需要使用 aCollection添加或删除一个标记。只需声明

private Marker userMarker;

然后在你添加Marker到地图的地方,存储一个参考

userMarker = map.addMarker(new MarkerOptions()
.position(newLatLng(latitude, longitude))
.title(MARKER_TITLE)
.snippet(SNIPPET));

当您更新您的位置时,可能onLocationChanged只是检查标记的存在并删除它(如果存在)并重新添加

if(userMarker == null){
    displayUserMarker(location);
} else {
    userMarker.remove;
    displayUserMarker(location);
}
于 2013-05-22T02:15:43.907 回答
1
map.clear();

在 if (location != null) 之前添加这个

这样每次位置更改时,所有标记和圆圈都会被删除并再次绘制

于 2013-05-22T06:16:51.343 回答
0

首先,保持对标记的引用就像你保持圆圈一样

myMarker = map.addMarker(new MarkerOptions().position(latLng).title("You are here!"));

当您想删除它们时,只需调用remove()

myCircle.remove();
myMarker.remove();
于 2013-05-22T07:17:56.310 回答