Android 放大时未隐藏簇标记
我试图在我的地图上实现一个簇标记,它的行为有点奇怪,首先,它向我显示簇标记,但也向我显示点标记,这不应该发生,当我放大仍然显示的簇标记时,我会添加一些图像来更好地解释它Android 放大时未隐藏簇标记,android,google-maps,google-maps-api-3,google-maps-api-2,markerclusterer,Android,Google Maps,Google Maps Api 3,Google Maps Api 2,Markerclusterer,我试图在我的地图上实现一个簇标记,它的行为有点奇怪,首先,它向我显示簇标记,但也向我显示点标记,这不应该发生,当我放大仍然显示的簇标记时,我会添加一些图像来更好地解释它 public class MapaViagem extends FragmentActivity { private GoogleMap googleMap; private String rm_IdViagem; private List<ClienteModel> mClienteMod
public class MapaViagem extends FragmentActivity {
private GoogleMap googleMap;
private String rm_IdViagem;
private List<ClienteModel> mClienteModel = new ArrayList<ClienteModel>();
private List<EnderecoModel> mEnderecoModel = new ArrayList<EnderecoModel>();
private ViagemModel mViagemModel = new ViagemModel();
private ClusterManager<MyItem> mClusterManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.maps);
ArrayList<LatLng> coordList = new ArrayList<LatLng>();
try {
Bundle parametros = getIntent().getExtras();
rm_IdViagem = parametros.getString("id_viagem");
Repositorio ca = new Repositorio(this);
mViagemModel = ca.getViagemPorId(Integer.valueOf(rm_IdViagem));
Repositorio cl = new Repositorio(this);
mClienteModel = cl.getClientesViagem(Integer.valueOf(rm_IdViagem));
System.out.println("TEM CLIENTE " + mClienteModel.size());
if(mClienteModel != null) {
for (int i = 0; i < mClienteModel.size(); i++) {
Repositorio mRepositorio = new Repositorio(this);
mEnderecoModel = mRepositorio.getListaEnderecosDoCliente(Integer.valueOf(mClienteModel.get(i).getClientes_id()));
for (int j = 0; j < mEnderecoModel.size(); j++) {
// Loading map
initilizeMap();
// Changing map type
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
// Showing / hiding your current location
googleMap.setMyLocationEnabled(true);
// Enable / Disable zooming controls
googleMap.getUiSettings().setZoomControlsEnabled(true);
// Enable / Disable my location button
googleMap.getUiSettings().setMyLocationButtonEnabled(true);
// Enable / Disable Compass icon
googleMap.getUiSettings().setCompassEnabled(true);
// Enable / Disable Rotate gesture
googleMap.getUiSettings().setRotateGesturesEnabled(true);
// Enable / Disable zooming functionality
googleMap.getUiSettings().setZoomGesturesEnabled(true);
final float latitude = Float.parseFloat(mEnderecoModel.get(j).getLatitude());
final float longitude = Float.parseFloat(mEnderecoModel.get(j).getLongitude());
coordList.add(new LatLng(latitude, longitude));
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latitude, longitude), 10));
mClusterManager = new ClusterManager<MyItem>(MapaViagem.this, googleMap);
mClusterManager.setRenderer(new MyClusterRenderer(MapaViagem.this, googleMap, mClusterManager));
googleMap.setOnCameraChangeListener(mClusterManager);
googleMap.setOnMarkerClickListener(mClusterManager);
addItems(coordList);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public class MyClusterRenderer extends DefaultClusterRenderer<MyItem> {
public MyClusterRenderer(Context context, GoogleMap map,
ClusterManager<MyItem> clusterManager) {
super(context, map, clusterManager);
}
@Override
protected void onBeforeClusterItemRendered(MyItem item, MarkerOptions markerOptions) {
super.onBeforeClusterItemRendered(item, markerOptions);
// item.setTitle(mClienteModel.get(i));
markerOptions.title(item.getTitle());
}
@Override
protected void onClusterItemRendered(MyItem clusterItem, Marker marker) {
super.onClusterItemRendered(clusterItem, marker);
//here you have access to the marker itself
}
@Override
protected boolean shouldRenderAsCluster(Cluster<MyItem> cluster) {
return cluster.getSize() > 3; // when count of markers is more than 3, render as cluster
}
}
private void addItems(List<LatLng> markers) {
for (int i = 0; i < markers.size(); i++) {
MyItem offsetItem = new MyItem(markers.get(i));
mClusterManager.addItem(offsetItem);
}
mClusterManager.cluster();
}
private void initilizeMap() {
if (googleMap == null) {
googleMap = ((MapFragment) getFragmentManager().findFragmentById(
R.id.map)).getMap();
// check if map is created successfully or not
if (googleMap == null) {
Toast.makeText(getApplicationContext(),
"Não foi possível carregar o mapa", Toast.LENGTH_SHORT)
.show();
}
}
}
@Override
protected void onResume() {
super.onResume();
initilizeMap();
}
}
首先,您需要定义当您的
ClusterManager
应该集群化时,因此在MyClusterRenderer
中有一个方法,您应该覆盖:
@Override
protected boolean shouldRenderAsCluster(Cluster<MyItem> cluster) {
return cluster.getSize() > 3; // when count of markers is more than 3, render as cluster
}
编辑:
我只是再看一遍你的代码,发现你忘了设置聚类算法,应该是:
...
mClusterManager = new ClusterManager<MyItem>(MapaViagem.this, googleMap);
mClusterManager.setAlgorithm(new GridBasedAlgorithm<MyItem>());
mClusterManager.setRenderer(new MyClusterRenderer(MapaViagem.this, googleMap, mClusterManager));
...
。。。
mClusterManager=newclustermanager(MapaViagem.this,googleMap);
setAlgorithm(新的GridBasedAlgorithm());
setRenderer(新的MyClusterRenderer(MapaViagem.this、googleMap、McClusterManager));
...
我知道这是一篇老文章,但今天我遇到了同样的问题
在花了一个小时试图解决问题后,我终于明白了我的应用程序会发生什么:
问题是集群管理器工作正常,问题是填充映射的方法被调用了两次
要解决此问题,只需添加mMap.clear()代码>在添加标记之前。在这里工作很有魅力
再见。我遇到了这个问题,并通过确保ClusterManager只被创建并分配给映射一次来解决它,尝试将and if语句放入您的create方法中。
最有可能是在onResume中再次初始化导致问题的映射时
public void onMapReady(GoogleMap googleMap) {
map = googleMap;
//only create one instance of cluster manager,
// if created again in onResume then click listeners don't work on reload and
//some markers don't disappear correctly on Zoom
if (clusterManager == null){
clusterManager =new ClusterManager(this, map);
}
map.setOnMarkerClickListener(clusterManager);
map.setOnInfoWindowClickListener(clusterManager.getMarkerManager());
map.setBuildingsEnabled(true);
//noinspection MissingPermission
map.setMyLocationEnabled(true);
map.setOnCameraIdleListener(clusterManager);
clusterManager.setOnClusterItemInfoWindowClickListener(this);
clusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<MyItem>() {
@Override
public boolean onClusterItemClick(MyItem item) {
return false;
}
});
public void onMapReady(谷歌地图谷歌地图){
地图=谷歌地图;
//仅创建群集管理器的一个实例,
//如果在onResume中再次创建,请单击“侦听器不工作”“重新加载”并
//某些标记在缩放时无法正确消失
if(clusterManager==null){
clusterManager=新的clusterManager(此,地图);
}
setOnMarkerClickListener(clusterManager);
setOnInfoWindowClickListener(clusterManager.getMarkerManager());
map.setBuildingsEnabled(true);
//不允许检查
map.setMyLocationEnabled(true);
map.setOnCameraideListener(clusterManager);
setOnClusterItemInfo窗口ClickListener(此);
setOnClusterItemClickListener(新的clusterManager.OnClusterItemClickListener(){
@凌驾
公共布尔onClusterItemClick(MyItem){
返回false;
}
});
我做了您建议的更改,但仍然得到了相同的结果现在更糟糕的是,我得到了一个计数为5的聚类标记,它不在我的LatLng参数中。我有相同的问题。但是,GridBaseAlgorithm将标记放在网格上,它们离实际位置很远。尽管它隐藏了标记,但这确实令人讨厌群集。你知道如何解决这个问题吗?可能使用另一种算法HMI也有类似的问题,即我的标记和群集只有在我第一次放大/缩小时才会出现。调用mClusterManager.cluster();为我工作,非常感谢伙计..当标记位于同一位置时,你找到了这样做的方法吗?即使我也面临同样的问题。想知道你是如何做到的。@AshwinNarayanan我刚刚停止使用群集标记,我无法解决,抱歉
...
mClusterManager = new ClusterManager<MyItem>(MapaViagem.this, googleMap);
mClusterManager.setAlgorithm(new GridBasedAlgorithm<MyItem>());
mClusterManager.setRenderer(new MyClusterRenderer(MapaViagem.this, googleMap, mClusterManager));
...
public void onMapReady(GoogleMap googleMap) {
map = googleMap;
//only create one instance of cluster manager,
// if created again in onResume then click listeners don't work on reload and
//some markers don't disappear correctly on Zoom
if (clusterManager == null){
clusterManager =new ClusterManager(this, map);
}
map.setOnMarkerClickListener(clusterManager);
map.setOnInfoWindowClickListener(clusterManager.getMarkerManager());
map.setBuildingsEnabled(true);
//noinspection MissingPermission
map.setMyLocationEnabled(true);
map.setOnCameraIdleListener(clusterManager);
clusterManager.setOnClusterItemInfoWindowClickListener(this);
clusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<MyItem>() {
@Override
public boolean onClusterItemClick(MyItem item) {
return false;
}
});