Android Google Map V2:点击另一个标记时如何更改之前点击的标记图标

更新:我已经通过添加previousMarker对象解决了性能问题。 所以只有以前点击的标记会被删除,并被replace为默认的图标。 但是,当我点击标记时信息窗口仍然不显示。


我有一个地图视图,并设置一些标记。 我想要的是当我点击一个标记,它改变它的图标是一个不同的图标,当我点击另一个标记,上一个标记的图标应该改变为原来的。

我所做的就是这样,但只要点击标记就可以改变标记图标。

@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) }; 

那么有没有办法让我以前点击标记改变它的图标回到默认,当我点击一个新的标记? 为我的英语道歉,如果你认为我应该为我的问题提出另一个标题,请帮忙。

Solutions Collecting From Web of "Android Google Map V2:点击另一个标记时如何更改之前点击的标记图标"

最后我find了最好,最简单的方法。 我做了一个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; } 

你可能正在寻找这种方法

 Called when the marker's info window is closed. 
 optional public func mapView(mapView: GMSMapView, didCloseInfoWindowOfMarker marker: GMSMarker)