簇标记没有隐瞒,当放大 [英] Cluster Marker not hiding when zoom in
问题描述
我想实现我的地图标记集群,它的行为有些奇怪,首先,它让我看到簇标记,但也表明了我点标记,这不应该发生的,当我放大簇标记仍呈现,我会添加一些图片来解释它更好的。
公共类MapaViagem扩展FragmentActivity { 私人GoogleMap的GoogleMap的;
私人字符串rm_IdViagem;
私人列表< ClienteModel> mClienteModel =新的ArrayList< ClienteModel>();
私人列表< EnderecoModel> mEnderecoModel =新的ArrayList< EnderecoModel>();
私人ViagemModel mViagemModel =新ViagemModel();
私人ClusterManager< MyItem> mClusterManager;
@覆盖
保护无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.maps);
ArrayList的<&经纬度GT; coordList =新的ArrayList<&经纬度GT;(); 尝试{ 捆绑parametros = getIntent()getExtras()。
rm_IdViagem = parametros.getString(id_viagem); Repositorio CA =新Repositorio(本);
mViagemModel = ca.getViagemPorId(Integer.valueOf(rm_IdViagem)); Repositorio CL =新Repositorio(本);
mClienteModel = cl.getClientesViagem(Integer.valueOf(rm_IdViagem));
的System.out.println(TEM CLIENTE+ mClienteModel.size()); 如果(mClienteModel!= NULL){ 的for(int i = 0; I< mClienteModel.size();我++){
Repositorio mRepositorio =新Repositorio(本);
mEnderecoModel = mRepositorio.getListaEnderecosDoCliente(Integer.valueOf(mClienteModel.get(ⅰ).getClientes_id()));
对于(INT J = 0; J< mEnderecoModel.size(); J ++){
//载入地图
initilizeMap();
//更改地图类型
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); //显示/隐藏您的当前位置
googleMap.setMyLocationEnabled(真); //启用/禁用变焦控制
googleMap.getUiSettings()setZoomControlsEnabled(真)。 //启用/禁用我的位置按钮
googleMap.getUiSettings()setMyLocationButtonEnabled(真)。 //启用/禁用罗盘图标
googleMap.getUiSettings()setCompassEnabled(真)。 //启用/禁用旋转手势
googleMap.getUiSettings()setRotateGesturesEnabled(真)。 //启用/禁用缩放功能
googleMap.getUiSettings()setZoomGesturesEnabled(真)。
最终浮动纬度= Float.parseFloat(mEnderecoModel.get(J).getLatitude());
最终浮动经度= Float.parseFloat(mEnderecoModel.get(J).getLongitude());
coordList.add(新经纬度(纬度,经度));
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(新经纬度(纬度,经度),10)); mClusterManager =新ClusterManager< MyItem>(MapaViagem.this,GoogleMap的);
mClusterManager.setRenderer(新MyClusterRenderer(MapaViagem.this,GoogleMap的,mClusterManager)); googleMap.setOnCameraChangeListener(mClusterManager);
googleMap.setOnMarkerClickListener(mClusterManager);
为addItems(coordList); }
}
}
}赶上(例外五){
e.printStackTrace();
}
}
公共类MyClusterRenderer扩展DefaultClusterRenderer< MyItem> { 公共MyClusterRenderer(上下文的背景下,GoogleMap的地图,
ClusterManager< MyItem> clusterManager){
超级(上下文,地图,clusterManager);
} @覆盖
保护无效onBeforeClusterItemRendered(MyItem项目的MarkerOptions的MarkerOptions){
super.onBeforeClusterItemRendered(项目的MarkerOptions);// item.setTitle(mClienteModel.get(I));
markerOptions.title(item.getTitle());
} @覆盖
保护无效onClusterItemRendered(MyItem clusterItem,标记标记){
super.onClusterItemRendered(clusterItem,标记); //这里您可以访问标记本身
} @覆盖
保护布尔shouldRenderAsCluster(集群与LT; MyItem>集群){
返回cluster.getSize()> 3; //当标记物的计数超过3,渲染为簇
}
}
私人无效为addItems(列表<&经纬度GT;标记){ 的for(int i = 0; I< markers.size();我++){
MyItem offsetItem =新MyItem(markers.get(I));
mClusterManager.addItem(offsetItem); }
mClusterManager.cluster();
} 私人无效initilizeMap(){
如果(GoogleMap的== NULL){
GoogleMap的=((MapFragment)getFragmentManager()。findFragmentById(
R.id.map))的GetMap()。 //检查是否映射成功与否创建
如果(GoogleMap的== NULL){
Toast.makeText(getApplicationContext(),
NAO FOIpossívelcarregarØ地图,Toast.LENGTH_SHORT)
。显示();
}
}
} @覆盖
保护无效onResume(){
super.onResume();
initilizeMap();
}
}
型号:
公共类MyItem实现ClusterItem { 私人经纬度mPosition;
私人字符串称号; 公共MyItem(经纬度位置){
mPosition =位置;
} @覆盖
公共经纬度为getPosition(){
返回mPosition;
} 公共字符串的getTitle(){
返回称号;
} 公共无效的setTitle(字符串名称){
this.title =称号;
}
}
首先,你需要定义,当你的 ClusterManager
应clusterize,所以在一个方法 MyClusterRenderer
你应该重写:
@覆盖
保护布尔shouldRenderAsCluster(集群与LT; MyItem>集群){
返回cluster.getSize()> 3; //当标记物的计数超过3,渲染为簇
}
其次,当你做一些改变你的标志,如添加,删除,更改标题,图标,位置,你应该叫集群()
方法。所以,你的为addItems
方法应该是这样的:
私人无效为addItems(列表<&经纬度GT;标记){ 的for(int i = 0; I< markers.size();我++){
MyItem offsetItem =新MyItem(markers.get(I));
mClusterManager.addItem(offsetItem);
}
mClusterManager.cluster();
}
编辑:
我只是看看你的code一次,发现你忘了设置clusterizing算法,它应该是:
...
mClusterManager =新ClusterManager< MyItem>(MapaViagem.this,GoogleMap的);
mClusterManager.setAlgorithm(新GridBasedAlgorithm&所述; MyItem>()); mClusterManager.setRenderer(新MyClusterRenderer(MapaViagem.this,GoogleMap的,mClusterManager));
...
I'm trying to implement a cluster marker on my map, and it is behaving a little strange, first, it shows me the cluster marker but also shows me the point markers, that shouldn't be happening, and when I zoom in the cluster marker still showing, i'll add some images to explain it better.
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();
}
}
Model:
public class MyItem implements ClusterItem {
private LatLng mPosition;
private String title;
public MyItem(LatLng position){
mPosition = position;
}
@Override
public LatLng getPosition() {
return mPosition;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
Firstly, you need to define, when your ClusterManager
should clusterize, so there is a method in MyClusterRenderer
you should override:
@Override
protected boolean shouldRenderAsCluster(Cluster<MyItem> cluster) {
return cluster.getSize() > 3; // when count of markers is more than 3, render as cluster
}
Secondly, when you make some changes with your markers such as adding, removing, changing title, icon, location, you should call cluster()
method. So your addItems
method should look like this:
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();
}
EDIT:
I just look at your code one more time, and found that you forgot to set the clusterizing algorithm, it should be:
...
mClusterManager = new ClusterManager<MyItem>(MapaViagem.this, googleMap);
mClusterManager.setAlgorithm(new GridBasedAlgorithm<MyItem>());
mClusterManager.setRenderer(new MyClusterRenderer(MapaViagem.this, googleMap, mClusterManager));
...
这篇关于簇标记没有隐瞒,当放大的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!