百度地图点聚合改造

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010724819/article/details/78456370

前几天,一个老铁问了我关于百度地图聚合的问题,这个聚合算法主要是百度谢好的,我们不做深究,但是关于表层的一些修改,比如聚合物图标,以及选中效果(点击聚合图标自动放大)等需要我们自己手动 添加代码了,哈哈!废话少说,先来看下效果图(PS:本文只介绍具体做法,而不深入解释各个类的作用,如果有需要可以移步其他博客哦,谢谢!):



聚合图标是我随便加的,哈哈。

首先我们来找到Activity:MarkerClusterDemo,在里面我们需要做的修改就是找到DefaultClusterRenderer类,在里面进行如下修改:

要使用我们自定义布局,所以先要去掉图层上的背景:

 private LayerDrawable makeClusterBackground() {
        mColoredCircleBackground = new ShapeDrawable(new OvalShape());
        ShapeDrawable outline = new ShapeDrawable(new OvalShape());
        outline.getPaint().setColor(0x00000000); // Transparent white.
        LayerDrawable background = new LayerDrawable(new Drawable[]{outline, mColoredCircleBackground});
        int strokeWidth = (int) (mDensity * 3);
        background.setLayerInset(1, strokeWidth, strokeWidth, strokeWidth, strokeWidth);
        return background;
    }

接着就是设定自定义背景,提一句,context这里其实已经有了,但是我们需要去在构造方法里面获取一下:

  /**
     * Called before the marker for a Cluster is added to the map.
     * The default implementation draws a circle with a rough count of the number of items.
     */
    protected void onBeforeClusterRendered(Cluster<T> cluster, MarkerOptions markerOptions) {
        int bucket = getBucket(cluster);
        BitmapDescriptor descriptor = mIcons.get(bucket);
        if (descriptor == null) {
            //设定默认背景为透明
            mColoredCircleBackground.getPaint().setColor(0x00000000);
            //设定自定义布局
            mIconGenerator.setContentView(View.inflate(context, R.layout.text_my_bubble, null));
            descriptor = BitmapDescriptorFactory.fromBitmap(mIconGenerator.makeIcon(getClusterText(bucket)));
            //修改图标
//            descriptor = BitmapDescriptorFactory.fromResource(R.drawable.icon_gcoding);
            mIcons.put(bucket, descriptor);
        }
        // TODO: consider adding anchor(.5, .5) (Individual markers will overlap more often)
        markerOptions.icon(descriptor);
    }
这样就是用上了我们自己的布局啦!


至于点击聚合点,然后放大,代码很简单:

 mClusterManager.setOnClusterClickListener(new ClusterManager.OnClusterClickListener<MyItem>() {
            @Override
            public boolean onClusterClick(Cluster<MyItem> cluster) {
                Toast.makeText(MarkerClusterDemo.this,
                        "有" + cluster.getSize() + "个点", Toast.LENGTH_SHORT).show();
                //打开聚合点
                ms = new MapStatus.Builder().target(new LatLng(cluster.getPosition().latitude, cluster.getPosition().longitude)).zoom(12).build();
                mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(ms));
                return false;
            }
        });

代码是最好的老师,下来来上代码:

百度地图点聚合代码

猜你喜欢

转载自blog.csdn.net/u010724819/article/details/78456370