其实说自定义呢也只是稍微修改了一点官方提供的代码
好吧,说重点:
1.下载官方的点聚合源码,地址为:https://github.com/amap-demo/android-cluster-marker
2.将里面主要的几个文件复制到项目中。还有demo中的那个RegionItem也要一起。
3.其实这样可以简单的实现点聚合了,不过是官方默认的实现的方法:
List list = new ArrayList();
for (int i = 0; i < 10000; i++) {
LatLng latLng = new LatLng(x, y, false);
RegionItem regionItem = new RegionItem(latLng, title);
list.add(regionItem);
}
mClusterOverlay=newClusterOverlay(map,list,dp2px(50,getActivity()),getActivity());
4.以下就是自己的改动了,在 RegionItem里面加一个属性为icon;再在接口ClusterItem里面添加一个方法来获取这个icon,对应的在RegionItem里面实现这个方法回图片。
5.接下来就是重要的一步了,在ClusterOverlay中找到addSingleClusterToMap()方法,这个方法就是加载marker的,将其参数添加一个bitmap。然后将传进来的这个bitmap转换为BitmapDescriptor设置到markerOptions的icon里面。
private void addSingleClusterToMap(Cluster cluster, Bitmap bitmap) {
BitmapDescriptor bitmap1 = BitmapDescriptorFactory.fromBitmap(bitmap);
LatLng latlng = cluster.getCenterLatLng();
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.anchor(0.5f, 0.5f)
.icon(bitmap1).position(latlng);
Marker marker = mAMap.addMarker(markerOptions);
marker.setAnimation(mADDAnimation);
marker.setObject(cluster);
marker.startAnimation();
cluster.setMarker(marker);
mAddMarkers.add(marker);
}
6.这个时候整个类会出现两个地方报错,一个在上面,一个在下面,先说上面这个。报错的方法为addClusterToMap(),他调用了addSingleClusterToMap()方法,需要多传一个bitmap。这时候最开始传进RegionItem里面的那个icon就有用了,这个icon可以是网络图片,也可以是本地图片,反正自己看着办。
通过方法传进来的list集合clusters,可以拿到集合点所有的RegionItem,在通过RegionItem拿出穿进去的图片,或下载,或读取。然后设置进addSingleClusterToMap()方法。
提示:如果是通过网络下载的图片,最好统一下载好,存在某个集合中,最后在提取,不然当图标刷新时会一直闪。最好再写一个三级缓存,免得每次刷新都需要下载图片。而且下载没必要开线程或者异步,因为本来就在子线程中。
private void addClusterToMap(List<Cluster> clusters) {
ArrayList<Marker> removeMarkers = new ArrayList<>();
removeMarkers.addAll(mAddMarkers);
AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0);
MyAnimationListener myAnimationListener = new MyAnimationListener(removeMarkers);
for (Marker marker : removeMarkers) {
marker.setAnimation(alphaAnimation);
marker.setAnimationListener(myAnimationListener);
marker.startAnimation();
}
Map map = new HashMap();
//List<Bitmap> list = new ArrayList<>();
for (int i = 0; i < clusters.size(); i++) {
Cluster cluster = clusters.get(i);
// 将InputStream转换成Bitmap
CacheUtils utils = new CacheUtils();
Bitmap bitmap = null;
bitmap = utils.getImageFromCache(cluster.getClusterItems().get(0).getIcon());//三级缓存的工具类来获取图片。
map.put(i, bitmap);//存map集合是因为有时候下载失败,bitmap会为null,设置进地图后会显示默认图标,特别丑,所以存个map,只把有值的存进去,而且是一一对应。
//list.add(bitmap);
}
for (Object i : map.keySet()) {
if (map.get(i) != null) {
addSingleClusterToMap(clusters.get((Integer) i), (Bitmap) map.get(i));
}
}
}
7.下面那个报错也是同理,虽然不知道有什么用,先改了再说。
Cluster cluster = (Cluster) message.obj;
CacheUtils utils = new CacheUtils();
Bitmap bitmap = null;
bitmap = utils.getImageFromCache(cluster.getClusterItems().get(0).getIcon());
addSingleClusterToMap(cluster, bitmap);
8.最后在需要的地方按最开始的方法添加就是了,只是多传一个icon就好了。
总结:最主要的就是addSingleClusterToMap()方法,这个方法在设置图标,然后还有cluster.getClusterItems()方法,这个方法能获得当前聚合点所有的内容。然后想实现什么自己改就可以了。虽然我没有看懂他是怎么实现的,但是确实可以改出来,嘿嘿嘿。只是下载图片的时候会耗时,在这个过程中地图会是白的,在考虑考虑怎么优化吧