今天项目因为需要在地图上加载上千个marker,造成了卡顿,所以需要继承百度地图的点聚合,那么来吧跟着步骤来:
一、集成百度地图SDK
这一步很简单就不细说了,只要带基础地图的SDK 就有聚合的功能。
二、下载百度地图Demo
因为关于聚合的实例,必须参照官方Demo的样子来、所以下载下来
需要拷贝的地方
1、clusterutil这个包全部拷贝过来
··注意1、记得报名全部改成自己的
···注意2、其中MyItem这个类是自定义marker样式用的,也可以直接写在自己的Activity或Fragment内部
/**
* 每个Marker点,包含Marker点坐标以及图标
*/
public class MyItem implements ClusterItem {
private final LatLng mPosition;
private final String mName;
private final String mNum;
//构造1、经纬度2、name和num为自定义的内容
public MyItem(LatLng latLng,String name,String num) {
mPosition = latLng;
mName = name;
mNum = num;
}
//获取marker的经纬度
@Override
public LatLng getPosition() {
return mPosition;
}
//marker为图片
@Override
public BitmapDescriptor getBitmapDescriptor() {
return BitmapDescriptorFactory.fromResource(R.drawable.icon_gcoding);
}
/* 也可以自定义一个布局来显示Marker这两种都额可以
@Override
public BitmapDescriptor getBitmapDescriptor() {
View inflate = View.inflate(this, R.layout.item_layout, null);
TextView viewById1 = inflate.findViewById(R.id.XXX);
View viewById2 = inflate.findViewById(R.id.XXX);
View viewById3 = inflate.findViewById(R.id.XXX);
viewById1.setText(mName);
viewById2.setText(mNum);
return BitmapDescriptorFactory.fromView(inflate);
}
*/
}
2、anim包中
3、layout中text_bubble.xml,需要注意里面的控件需要换成自己的报名。
三、开始写
1、初始化 地图
mMapView = (MapView) findViewById(R.id.bmapView);
mMapStatus = new MapStatus.Builder().target(new LatLng(39.914935, 116.403119)).zoom(8).build();
mBaiduMap = mMapView.getMap();
mBaiduMap.setOnMapLoadedCallback(this);
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(mMapStatus));
2、
// 定义点聚合管理类ClusterManager
mClusterManager = new ClusterManager<MyItem>(this, mBaiduMap);
// 添加Marker点
addMarkers();
// 设置地图监听,当地图状态发生改变时,进行点聚合运算
mBaiduMap.setOnMapStatusChangeListener(mClusterManager);
// 设置maker点击时的响应
mBaiduMap.setOnMarkerClickListener(mClusterManager);
//聚合圈点击
mClusterManager.setOnClusterClickListener(new ClusterManager.OnClusterClickListener<MyItem>() {
@Override
public boolean onClusterClick(Cluster<MyItem> cluster) {
Toast.makeText(MarkerClusterDemo.this, "有" + cluster.getSize() + "个点", Toast.LENGTH_SHORT).show();
return false;
}
});
//每隔marker点击
mClusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<MyItem>() {
@Override
public boolean onClusterItemClick(MyItem item) {
Toast.makeText(MarkerClusterDemo.this, "点击单个Item", Toast.LENGTH_SHORT).show();
return false;
}
});
mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
//marker被点击时回调的方法
//若响应点击事件,返回true,否则返回false
//默认返回false
@Override
public boolean onMarkerClick(Marker marker) {
Log.i("打印",marker.getPosition().latitude+"");
return true;
}
});
3、// 添加Marker点的方法
/**
* 向地图添加Marker点
*/
public void addMarkers() {
// 添加Marker点
LatLng llA = new LatLng(39.963175, 116.400244);
LatLng llB = new LatLng(39.942821, 116.369199);
LatLng llC = new LatLng(39.939723, 116.425541);
LatLng llD = new LatLng(39.906965, 116.401394);
LatLng llE = new LatLng(39.956965, 116.331394);
LatLng llF = new LatLng(39.886965, 116.441394);
LatLng llG = new LatLng(39.996965, 116.411394);
LatLng llG1 = new LatLng(39.996165, 116.411394);
LatLng llG2 = new LatLng(39.996265, 116.411394);
LatLng llG3 = new LatLng(39.996365, 116.411394);
List<MyItem> items = new ArrayList<MyItem>();
items.add(new MyItem(llA));
items.add(new MyItem(llB));
items.add(new MyItem(llC));
items.add(new MyItem(llD));
items.add(new MyItem(llE));
items.add(new MyItem(llF));
items.add(new MyItem(llG));
items.add(new MyItem(llG1));
items.add(new MyItem(llG2));
items.add(new MyItem(llG3));
mClusterManager.addItems(items);
}
这里就已经可以正常的使用了
也就是说直接在mClusterManager这个类里addItems(List)就可以了 成组添加