android开发中高德地图点聚合自定义聚合点的样式

其实说自定义呢也只是稍微修改了一点官方提供的代码

好吧,说重点:
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()方法,这个方法能获得当前聚合点所有的内容。然后想实现什么自己改就可以了。虽然我没有看懂他是怎么实现的,但是确实可以改出来,嘿嘿嘿。只是下载图片的时候会耗时,在这个过程中地图会是白的,在考虑考虑怎么优化吧

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值