1.首先需要创建两个ArrayList(一个存放所有的maker数据,一个存放屏幕内的maker数据)
private ArrayList<MarkerOptions> markerOptionsListInView = new ArrayList<MarkerOptions>();
private ArrayList<MarkerOptions> markerOptionsListall = new ArrayList<MarkerOptions>();
2.第二步把maker数据添加到markerOptionsListall 里边
private void addMarkersToMap() {
int size = chargList.size();
for (int i = 0; i < size; i++) {
double wei =chargList.get(i).getPoi_wei();
double jing = chargList.get(i).getPoi_jing();
LatLng latlng = new LatLng(wei, jing);
markerOptionsListall.add(new MarkerOptions().position(latlng).title(i + ""));
}
3.在添加屏幕移动的监控,然后去动态判断屏幕内的maker是否需要聚合
@Override
public void onCameraChangeFinish(CameraPosition arg0) {
// TODO Auto-generated method stub
resetMarks();
}
private void resetMarks() {
// 开始刷新
//executorService.execute(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Projection projection = mAMap.getProjection();
Point p = null;
markerOptionsListInView.clear();
// 获取在当前视野内的marker;提高效率
ArrayList<MyGaodeImageView> clustersMarker = new ArrayList<MyGaodeImageView>();
for (MarkerOptions mp : markerOptionsListall) {
p = projection.toScreenLocation(mp.getPosition());
if (p.x < 0 || p.y < 0 || p.x > screenWidth || p.y > screenHeight || p.x == 0 || p.y == 0
|| p.x == screenWidth || p.y == screenHeight) {
// 不添加到计算的列表中
} else {
markerOptionsListInView.add(mp);
if (clustersMarker.size() == 0) {
// 添加一个新的自定义marker
clustersMarker.add(new MyGaodeImageView(IndexMapActivity.this, mp, projection, 80));// 80=相距多少才聚合
} else {
boolean isIn = false;
for (MyGaodeImageView cluster : clustersMarker) {
// 判断当前的marker是否在前面marker的聚合范围内
// 并且每个marker只会聚合一次。
if (cluster.getBounds().contains(mp.getPosition())) {
cluster.addMarker(mp);
isIn = true;
break;
}
}
// 如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较
if (!isIn) {
clustersMarker.add(new MyGaodeImageView(IndexMapActivity.this, mp, projection, 80));// 80=相距多少才聚合
}
}
}
}
mAMap.clear();
for (MyGaodeImageView mmc : clustersMarker) {
mmc.setpositionAndIcon();
mAMap.addMarker(mmc.getOptions());
}
}
//});
}
4.MyGaodeImageView类和它的布局my_car_cluster_view,图片的话自己改改
package com.aoss.main.charging;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Point;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.MeasureSpec;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.amap.api.maps.Projection;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.LatLngBounds;
import com.amap.api.maps.model.MarkerOptions;
import com.amap.yuntu.scheme.R;
import java.util.ArrayList;
public class MyGaodeImageView {
// 上下文
private Activity activity;
// marker类
private MarkerOptions options;
// 当前可观区域里的 聚合过之后的集合
private ArrayList<MarkerOptions> includeMarkers;
// 创建区域
private LatLngBounds bounds;
/**
* 头像加载完监听
*/
public MyGaodeImageView(Activity activity, MarkerOptions firstMarkers, Projection projection, int gridSize) {
this.activity = activity;
options = new MarkerOptions();
Point point = projection.toScreenLocation(firstMarkers.getPosition());
// 范围类
Point southwestPoint = new Point(point.x - gridSize, point.y + gridSize);
// 范围类
Point northeastPoint = new Point(point.x + gridSize, point.y - gridSize);
bounds = new LatLngBounds(projection.fromScreenLocation(southwestPoint),
projection.fromScreenLocation(northeastPoint));
// 设置初始化marker属性
options.anchor(0.5f, 0.5f).title(firstMarkers.getTitle()).position(firstMarkers.getPosition());
// .icon(firstMarkers.getIcon()).snippet(firstMarkers.getSnippet());
includeMarkers = new ArrayList<MarkerOptions>();
includeMarkers.add(firstMarkers);
}
public LatLngBounds getBounds() {
return bounds;
}
public MarkerOptions getOptions() {
return options;
}
public void setOptions(MarkerOptions options) {
this.options = options;
}
/**
* 添加marker
*/
public void addMarker(MarkerOptions markerOptions) {
includeMarkers.add(markerOptions);// 添加到列表中
}
/**
* 设置聚合点的中心位置以及图标
*/
public void setpositionAndIcon() {
int size = includeMarkers.size();
double lat = 0.0;
double lng = 0.0;
// 一个的时候
if (size == 1) {// 设置marker单个属性
// 设置marker位置
options.position(new LatLng(includeMarkers.get(0).getPosition().latitude,
includeMarkers.get(0).getPosition().longitude));
//options.title("聚合点");
// options.icon(BitmapDescriptorFactory.fromBitmap(getViewBitmap(getView(size))));
} else {// 聚合的时候
// 设置marker聚合属性
for (MarkerOptions op : includeMarkers) {
lat += op.getPosition().latitude;
lng += op.getPosition().longitude;
}
// 设置marker的位置为中心位置为聚集点的平均位置
options.position(new LatLng(lat / size, lng / size));
options.icon(BitmapDescriptorFactory.fromBitmap(getViewBitmap(getView(size))));
// int iconType = size / 10;
//
// switch (iconType) {
// case 10:
// options.icon(
// BitmapDescriptorFactory.fromBitmap(getViewBitmap(getView(size,
// R.drawable.marker_cluster_10))));
// break;
// case 50:
// options.icon(
// BitmapDescriptorFactory.fromBitmap(getViewBitmap(getView(size,
// R.drawable.marker_cluster_20))));
// break;
// // case 2:
// // options.icon(BitmapDescriptorFactory
// // .fromBitmap(getViewBitmap(getView(size,
// // R.drawable.marker_cluster_30))));
// // break;
// // case 3:
// // options.icon(BitmapDescriptorFactory
// // .fromBitmap(getViewBitmap(getView(size,
// // R.drawable.marker_cluster_30))));
// // break;
// // case 4:
// // options.icon(BitmapDescriptorFactory
// // .fromBitmap(getViewBitmap(getView(size,
// // R.drawable.marker_cluster_50))));
// // break;
// default:
// options.icon(BitmapDescriptorFactory
// .fromBitmap(getViewBitmap(getView(size,
// R.drawable.marker_cluster_100))));
// break;
// }
}
}
public View getView(int carNum) {
View view = activity.getLayoutInflater().inflate(R.layout.my_car_cluster_view, null);
TextView carNumTextView = (TextView) view.findViewById(R.id.my_car_num);
RelativeLayout myCarLayout = (RelativeLayout) view.findViewById(R.id.my_car_bg);
myCarLayout.setBackgroundResource(R.drawable.location_marker_man1);
carNumTextView.setText(String.valueOf(carNum));
return view;
}
/**
* 把一个view转化成bitmap对象
*/
public static Bitmap getViewBitmap(View view) {
view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
view.buildDrawingCache();
Bitmap bitmap = view.getDrawingCache();
return bitmap;
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<RelativeLayout
android:id="@+id/my_car_bg"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/my_car_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:gravity="center"
android:textColor="@color/blue_cloud_scheme"
android:textSize="12sp" />
</RelativeLayout>
</LinearLayout>
5.记得注册OnCameraChangeListener监听接口,如果这个任务都在主线程中,再加上很多maker的话,就会很卡,这时就需要多线程的帮助了(个人理解不到位对于多线程,你们可以发挥)首先下边这样,然后再第3步中那样。
private ExecutorService executorService = null;
executorService = Executors.newCachedThreadPool();