Android Google地图V2:当点击另一个标记时如何更改先前点击标记的图标

7
更新:我通过添加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个新的图标,但是我想要的只是当前点击的标记更改其图标。

因此,我也添加了两行代码来实现这样的效果。它成功地实现了我想要的效果,但也有一些缺点(见下文)。

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

当我点击新的标记时,是否有一种方法可以使先前点击的标记将其图标恢复为默认值?如果您认为我应该为我的问题提供另一个标题,请帮忙。抱歉我的英语不好。


你将previousMarker标记作为初始阶段了吗? - pRaNaY
3个回答

18

我最终找到了最好、最简单的方法。我创建了一个 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;
}

我写了一些代码,最终像这样工作了,但是当我离开页面并回来时就出现了问题。我不知道我的代码哪里出错了。 - Ashkan
如果您使用集群,则会将聚类圆圈更改为标记图像。 - CoolMind

0

你可能正在寻找这个方法

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接