前几天,一个老铁问了我关于百度地图聚合的问题,这个聚合算法主要是百度谢好的,我们不做深究,但是关于表层的一些修改,比如聚合物图标,以及选中效果(点击聚合图标自动放大)等需要我们自己手动 添加代码了,哈哈!废话少说,先来看下效果图(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;
}
});
代码是最好的老师,下来来上代码: