更新:我通过添加previousMarker对象解决了性能问题。因此,只有先前单击的标记将被删除并替换为默认图标。但是,当我点击标记时,信息窗口仍未显示。
我有一个地图视图并在其上设置了一些标记。我想要的是当我点击一个标记时,它将其图标更改为一个不同的图标,当我点击另一个标记时,前一个标记的图标应该更改为其原始图标。
我所做的就是这样,但只要我点击标记就会改变标记图标。
@Override
public boolean onMarkerClick(Marker marker) { //Called when a marker has been clicked or tapped.
LatLng markerPos=marker.getPosition();
String markerLocationName=marker.getTitle();
String markerSubCategoryName=marker.getSnippet();
marker.remove();
MarkerOptions markerOptions =
new MarkerOptions().position(markerPos)
.title(markerLocationName)
.snippet(markerSubCategoryName)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.new_icon));// Changing marker icon
mMap.addMarker(markerOptions);
Log.d("marker","change marker icon"); // can open a dialog window here
return false;
}
因此,如果我点击2个标记,我会看到2个新图标,同时我想要的只是当前点击的标记更改其图标。
所以我也做了类似的事情,增加了2行代码。它成功地做了我想要的但它有一些缺点(见下文)。
@Override
public boolean onMarkerClick(Marker marker) { //Called when a marker has been clicked or tapped.
mMap.clear();
populateAllMarkersOnMap();//repopulate markers on map
LatLng markerPos=marker.getPosition();
String markerLocationName=marker.getTitle();
String markerSubCategoryName=marker.getSnippet();
marker.remove(); //remove the current clicked marker
MarkerOptions markerOptions =
new MarkerOptions().position(markerPos)
.title(markerLocationName)
.snippet(markerSubCategoryName)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.new_icon));// Changing marker icon
mMap.addMarker(markerOptions); //add marker with new icon into map
return false;
}
缺点是1 /它“禁用”信息窗口(同样的事情也发生在第一种方式)。 2 /清除地图上的所有标记并再次设置所有标记。想象一下,我有100个标记,如果每次点击都会出现性能问题吗?
populateAllMarkersOnMap()目前可以像这样简单:
private void populateAllMarkersOnMap(){
setMarker(latA1, lonA1, "A1","A1.1");
setMarker(latA2, lonA2, "A2","A2.1");
// ... (100 times or populated via a loop)
};
当我点击新标记时,有没有办法让先前点击的标记将其图标更改回默认值?为我的英语道歉,如果你认为我应该为我的问题添加另一个标题,请帮忙。
答案 0 :(得分:16)
最后,我找到了最好,最简单的方法。我制作了一个previousMarker对象并存储了当前点击的标记:
@Override
public boolean onMarkerClick(Marker marker) { //Called when a marker has been clicked or tapped.
if(previousMarker!=null){
previousMarker.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.dot_icon));
}
marker.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.ct_icon));
previousMarker=marker; //Now the clicked marker becomes previousMarker
return false;
}
答案 1 :(得分:0)
你可能正在寻找这种方法
Called when the marker's info window is closed.
optional public func mapView(mapView: GMSMapView, didCloseInfoWindowOfMarker marker: GMSMarker)
答案 2 :(得分:0)
我找到了最好,最简单的方法。我制作了另一个标记对象,并将当前单击的标记存储在此处输入代码
@Override
public boolean onMarkerClick(Marker marker) { //Called when a marker has been clicked or tapped.
if(previousMarker!=null){
marker2.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.dot_icon));
}
marker.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.ct_icon));
marker2=marker; //Now the clicked marker becomes previousMarker
return false;
}