项目里 刚好用到了 高德聚合 开始找了个官方的demo 发现 android 和ios的效果 差很多 ,但还是要做成一致的 。。oedoukei 当然 这难不倒wuli 戴老师 ,几个小时 就帮我改编了一版。。。
高德聚合的demo地址:
(https://github.com/amap-demo/android-cluster-marker)
那下面 我就贴一个工具类 哦:
public class AggregationUtils implements AMap.OnCameraChangeListener,
AMap.InfoWindowAdapter, AMap.OnMarkerClickListener,AMap.OnMapClickListener {
private ArrayList mClusters = new ArrayList<>(); //聚合点
private List allMarker = new ArrayList<>(); //所有的marker
private Marker clickMarker; //当前点击的marker
private float zoom; //当前放大缩小程度
private int aggregationRadius=100;//聚合半径
private double mClusterDistance; //聚合范围
private List allPoints = new ArrayList(); //所有的点
private Context context;
private AMap aMap;
public void setContext(Context context) {
this.context = context;
}
/**
* 设置所有的点
* @param allPoints
*/
public void setAllPoints(List allPoints) {
this.allPoints = allPoints;
}
/**
* 设置map
* @param aMap
*/
public void setaMap(AMap aMap) {
this.aMap = aMap;
zoom = aMap.getCameraPosition().zoom;
aMap.setInfoWindowAdapter(this);
aMap.setOnCameraChangeListener(this);
aMap.setOnMarkerClickListener(this);
aMap.setOnMapClickListener(this);
}
/**
* 显示所有的点
*/
private void showPoint(){
assignClusters();
//画圆
for (int i=0;i clusters) {
//循环所有的聚合点
for (Cluster cluster : clusters) {
LatLng clusterCenterPoint = cluster.getCenterLatLng();
//计算当前点和聚合点之间的距离
double distance = AMapUtils.calculateLineDistance(latLng, clusterCenterPoint);
//如果距离在规定点范围内,则说明有聚合点
if (distance < mClusterDistance) {
return cluster;
}
}
return null;
}
/**
* 获取每个聚合点的绘制样式
*/
private BitmapDescriptor getBitmapDes(int num) {
TextView textView = new TextView(context);
textView.setText(String.valueOf(num));
textView.setGravity(Gravity.CENTER);
textView.setTextColor(Color.WHITE);
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 15);
textView.setBackground(getDrawAble());
return BitmapDescriptorFactory.fromView(textView);
}
private Drawable getDrawAble() {
int radius = DensityUtils.dp2px(context, 50);
Drawable bitmapDrawable = new BitmapDrawable(null, drawCircle(radius));
return bitmapDrawable;
}
private Bitmap drawCircle(int radius) {
Bitmap bitmap = Bitmap.createBitmap(radius * 2, radius * 2,
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Paint paint1 = new Paint();
paint1.setColor(Color.parseColor("#2dbdff"));
paint1.setAlpha(160);
canvas.drawCircle(radius,radius,radius-10,paint1);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.parseColor("#0386ba")); //设置画笔颜色
paint.setStyle(Paint.Style.STROKE); //设置画笔为空心
paint.setStrokeWidth( DensityUtils.dp2px(context, 4)); //设置线宽
canvas.drawCircle(radius,radius,radius-10,paint);
return bitmap;
}
/**
* 点击地图
* @param latLng
*/
@Override
public void onMapClick(LatLng latLng) {
clickMarker.hideInfoWindow();
}
/**
* 地图移动
* @param cameraPosition
*/
@Override
public void onCameraChange(CameraPosition cameraPosition) {
if(zoom!=cameraPosition.zoom){
clickMarker = null;
zoom = cameraPosition.zoom;
}
}
/**
* 地图移动完成
* @param cameraPosition
*/
@Override
public void onCameraChangeFinish(CameraPosition cameraPosition) {
for (Marker marker:allMarker){
if(clickMarker!=null&&clickMarker.getPosition().longitude==marker.getPosition().longitude&&clickMarker.getPosition().latitude==marker.getPosition().latitude){
continue;
}
marker.hideInfoWindow();
marker.remove();
}
allMarker = new ArrayList();
mClusters = new ArrayList();
mClusterDistance = aMap.getScalePerPixel()*aggregationRadius;//聚合的范围半径
showPoint();
//如果点击的marker 不再可是范围内
LatLngBounds visibleBounds = aMap.getProjection().getVisibleRegion().latLngBounds;
if(!visibleBounds.contains(clickMarker.getPosition())){
clickMarker.hideInfoWindow();
clickMarker.remove();
clickMarker=null;
}
}
/**
* marker 点击
* @param
*/
@Override
public boolean onMarkerClick(Marker marker) {
clickMarker = marker;
marker.showInfoWindow();
//返回:true 表示点击marker 后marker 不会移动到地图中心;返回false 表示点击marker 后marker 会自动移动到地图中心
return true;
}
/**
* 自定义弹框
* @param marker
* @return
*/
@Override
public View getInfoWindow(Marker marker) {
View infoContent = LayoutInflater.from(context).inflate(R.layout.dialog_behavior, null);
render(infoContent,marker);
return infoContent;
}
@Override
public View getInfoContents(Marker marker) {
return null;
}
/**
* 自定义infowinfow窗口
* @param
* @param view
*/
public void render(View view,Marker marker) {
final Cluster cluster = (Cluster)marker.getObject();
ListView recyclerView = (ListView) view.findViewById(R.id.listView);
recyclerView.setAdapter(new BaseAdapter() {
@Override
public int getCount() {
return cluster.mClusterItems.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = LayoutInflater.from(context).inflate(R.layout.item_behavior, parent,false);
TextView tv = (TextView) view.findViewById(R.id.text_item);
tv.setText(cluster.mClusterItems.get(position).address);
return view;
}
});
setListViewHeightBasedOnChildren(recyclerView);
}
/**
* 切换页面的时候调用
*/
public void resetData(){
if(clickMarker!=null){
clickMarker.hideInfoWindow();
}
allPoints.clear();
}
/**
* 动态设置listview 的高度
* @param listView
*/
public void setListViewHeightBasedOnChildren(ListView listView) {
//获取listview的适配器
ListAdapter listAdapter = listView.getAdapter(); //item的高度
if (listAdapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0); //计算子项View 的宽高 //统计所有子项的总高度
totalHeight += listItem.getMeasuredHeight()+listView.getDividerHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
int maxHeight=DensityUtils.dp2px(context,100);
if(totalHeight>maxHeight){
params.height=maxHeight;
}else{
params.height = totalHeight;
}
listView.setLayoutParams(params);
}
/**
*
* 聚合点
*/
public class Cluster {
//聚合点位置
private LatLng mLatLng;
//聚合点中列表
private List mClusterItems = new ArrayList();
Cluster( LatLng latLng) {
mLatLng = latLng;
}
LatLng getCenterLatLng() {
return mLatLng;
}
void addClusterItem(LatLng latLng ,String address,String id) {
ClusterItem clusterItem=new ClusterItem();
clusterItem.latLng=latLng;
clusterItem.address=address;
clusterItem.id=id;
mClusterItems.add(clusterItem);
}
}
static class ClusterItem{
public LatLng latLng;
public String address;
public String id;
}
}
- 初始化调用
aggregationutils=new AggregationUtils();
aggregationutils.setaMap(aMap);
aggregationutils.setContext(getActivity());
- set数据点
aggregationutils.setAllPoints(allPoints);