Android:根据颜色检查谷歌地图标记是否存在

时间:2015-08-14 09:17:25

标签: android google-maps google-maps-api-3 marker

我有一个名为create marker的方法,它使用LatLng和颜色在特定的坐标处创建标记。

public void createMarker(LatLng latLong, float thisNewColor){
    MarkerOptions options = new MarkerOptions().position(latLong).draggable(false).icon(BitmapDescriptorFactory.defaultMarker(thisNewColor));
    if(mMap != null) {
        mMap.addMarker(options).showInfoWindow();
        CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLong, 17);
        mMap.animateCamera(cameraUpdate);
        mMap.setMyLocationEnabled(true);
    }
}

根据用户发送将成为绿色标记的新位置,地图需要在每次发送新位置时进行更新。如何检查绿色标记是否存在,如果存在,则删除并创建一个新标记?

  

修改

此线程在后台执行,当找到新位置LatLng时,它会以绿色执行createMarker方法。所以我需要检查是否存在,并在线程收到新的LatLng时替换它:

@SuppressWarnings("unused")
public void onEventMainThread(DisplayNewLocation displayNewLocation){
    newLatLngToDisplay = displayNewLocation.getNewLatLng();
    this.createMarker(newLatLngToDisplay, BitmapDescriptorFactory.HUE_GREEN);
}
  

编辑2

这是我尝试检查添加的标记是否存在,然后通过使用全局布尔标志将其设置为不可见并尝试覆盖它。在构建和测试时,它不会覆盖标记,它只是创建一个新标记。因此,为什么我认为通过标记颜色最容易做到这一点。

@SuppressWarnings("unused")
    public void onEventMainThread(DisplayNewLocation displayNewLocation){
        if(isPeerLocation){
            this.peerLocation.visible(false);
        }
        newLatLngToDisplay = displayNewLocation.getNewLatLng();
        this.createMarker(newLatLngToDisplay, BitmapDescriptorFactory.HUE_GREEN);
        Log.e("NEwLatLng Success!- ", newLatLngToDisplay.toString());
}

public void createMarker(LatLng latLong, float thisNewColor){
    if(thisNewColor == BitmapDescriptorFactory.HUE_GREEN){
        peerLocation = new MarkerOptions().position(latLong).draggable(false).icon(BitmapDescriptorFactory.defaultMarker(thisNewColor));
        this.isPeerLocation = true;
    }else{
        options = new MarkerOptions().position(latLong).draggable(false).icon(BitmapDescriptorFactory.defaultMarker(thisNewColor));
        this.isPeerLocation = false;
    }

    //MarkerOptions options = new MarkerOptions().position(latLong).draggable(false).icon(BitmapDescriptorFactory.defaultMarker(thisNewColor));
    if(mMap != null) {
        if(isPeerLocation) {
            mMap.addMarker(peerLocation).showInfoWindow();
        }else{
            mMap.addMarker(options).showInfoWindow();
        }
        CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLong, 17);
        mMap.animateCamera(cameraUpdate);
        mMap.setMyLocationEnabled(true);
    }
}

由于

3 个答案:

答案 0 :(得分:1)

如果标记存在于HashMap中,您可以创建一个HashMap(键是颜色,MarkerOptions作为值),您将在其中存储所有标记,然后手动检查。

修改

试试此代码

Map<Integer, Marker> mMarkers = new HashMap<>();
public void createMarker(LatLng latLong, float thisNewColor){
    MarkerOptions options = new MarkerOptions().position(latLong).draggable(false).icon(BitmapDescriptorFactory.defaultMarker(thisNewColor));
    if(mMap != null) {
        if (mMarkers.contains(thisNewColor)){
            Marker old = mMarkers.get(thisNewColor);
            old.remove();
        }
        Marker marker = mMap.addMarker(options);
        marker.showInfoWindow();
        mMarkers.put(thisNewColor, marker);
        CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLong, 17);
        mMap.animateCamera(cameraUpdate);
        mMap.setMyLocationEnabled(true);
    }
}

答案 1 :(得分:0)

无法使用颜色,因此在创建新标记之前清除所有标记

修改

尝试

 Marker marker; 

if(marker!=null) { 
marker.remove();
 marker=mMap.addMarker(options);
} 

答案 2 :(得分:0)

所以我解决了我的问题。它不是一个理想的解决方案,但它确实解决了我的问题。

我只是添加了一个标志来检查对等位置是否被解析为createMarker方法。如果是,则清除地图,并重新绘制客户原始位置,与同行&#39;新的位置。

public void createMarker(LatLng latLong, float thisNewColor, boolean isPeerLocation){
    MarkerOptions options = new MarkerOptions().position(latLong).draggable(false).icon(BitmapDescriptorFactory.defaultMarker(thisNewColor));
    if(mMap != null) {
        if(isPeerLocation){
            mMap.clear();
            //This is the method that is called to place your current location on the map
            handleNewLocation(location);
        }
        mMap.addMarker(options).showInfoWindow();
        CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLong, 17);
        mMap.animateCamera(cameraUpdate);
        mMap.setMyLocationEnabled(true);
    }
}