簇标记没有隐瞒,当放大 [英] Cluster Marker not hiding when zoom in

查看:506
本文介绍了簇标记没有隐瞒,当放大的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想实现我的地图标记集群,它的行为有些奇怪,首先,它让我看到簇标记,但也表明了我点标记,这不应该发生的,当我放大簇标记仍呈现,我会添加一些图片来解释它更好的。

 公共类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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆