第一篇帖子已经把基本的配置和基础定位完成,这一篇主要是在图层上添加遮盖物,包括绘制点、线、圆形遮盖物、椭圆遮盖物和矩形、以及多边形遮盖物
绘制点遮盖物
/**
* 绘制点遮盖物
*/
LatLng latLng = new LatLng(39.906901, 116.397972);
aMap.addMarker(new MarkerOptions().position(latLng).title("北京").snippet("DefaultMarker"));
设置自定义遮盖物
/**
* 设置自定义遮盖物
*/
MarkerOptions markerOption = new MarkerOptions();
markerOption.position(latLng);
markerOption.title("北京市").snippet("首都");
markerOption.draggable(true);//设置Marker可拖动
markerOption.icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory
.decodeResource(getResources(), R.mipmap.badcar)));
// 将Marker设置为贴地显示,可以双指下拉地图查看效果
markerOption.setFlat(true);//设置marker平贴地图效果
Marker marker = aMap.addMarker(markerOption);
添加marker动画
/**
* 添加marker动画
*/
Animation animation = new RotateAnimation(marker.getRotateAngle(), marker.getRotateAngle() + 180, 0, 0, 0);
long duration = 1000L;
animation.setDuration(duration);
animation.setInterpolator(new LinearInterpolator());
marker.setAnimation(animation);
marker.startAnimation();
marker点击事件
// 定义 Marker 点击事件监听
AMap.OnMarkerClickListener markerClickListener = new AMap.OnMarkerClickListener() {
// marker 对象被点击时回调的接口
// 返回 true 则表示接口已响应事件,否则返回false
@Override
public boolean onMarkerClick(Marker marker) {
Toast.makeText(MainActivity.this, "点击marker了", Toast.LENGTH_SHORT);
return false;
}
};
// 绑定 Marker 被点击事件
aMap.setOnMarkerClickListener(markerClickListener);
marker拖拽事件
// 定义 Marker拖拽的监听
AMap.OnMarkerDragListener markerDragListener = new AMap.OnMarkerDragListener() {
// 当marker开始被拖动时回调此方法, 这个marker的位置可以通过getPosition()方法返回。
// 这个位置可能与拖动的之前的marker位置不一样。
// marker 被拖动的marker对象。
@Override
public void onMarkerDragStart(Marker arg0) {
Log.e("tag", "开始drag");
}
// 在marker拖动完成后回调此方法, 这个marker的位置可以通过getPosition()方法返回。
// 这个位置可能与拖动的之前的marker位置不一样。
// marker 被拖动的marker对象。
@Override
public void onMarkerDragEnd(Marker arg0) {
Log.e("tag", "拖拽结束");
}
// 在marker拖动过程中回调此方法, 这个marker的位置可以通过getPosition()方法返回。
// 这个位置可能与拖动的之前的marker位置不一样。
// marker 被拖动的marker对象。
@Override
public void onMarkerDrag(Marker arg0) {
Log.e("tag", "拖拽中");
}
};
// 绑定marker拖拽事件
aMap.setOnMarkerDragListener(markerDragListener);
//设置infoWindow
AMap.OnInfoWindowClickListener listener = new AMap.OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker arg0) {
arg0.setTitle("infowindow clicked");
}
};
//绑定信息窗点击事件
aMap.setOnInfoWindowClickListener(listener);
划线
/**
* 划线
*/
List<LatLng> latLngs = new ArrayList<>();
latLngs.add(new LatLng(39.999391, 116.135972));
latLngs.add(new LatLng(39.898323, 116.057694));
aMap.addPolyline(new PolylineOptions().
addAll(latLngs).width(10).color(Color.argb(255, 1, 1, 1)));
画圆
/**
* 绘制圆
*/
LatLng latLng2 = new LatLng(39.984059, 116.307771);
aMap.addCircle(new CircleOptions().
center(latLng2).
radius(1000).
fillColor(Color.argb(200, 1, 1, 1)).
strokeColor(Color.argb(200, 1, 1, 1)).
strokeWidth(15));
绘制椭圆
/**
* 绘制椭圆
*/
aMap.addPolygon(new PolygonOptions()
.addAll(createRectangle(new LatLng(40.238068, 116.501654), 1, 1))
.fillColor(Color.TRANSPARENT).strokeColor(Color.RED).strokeWidth(1));
PolygonOptions options = new PolygonOptions();
int numPoints = 400;
float semiHorizontalAxis = 5f;
float semiVerticalAxis = 2.5f;
double phase = 2 * Math.PI / numPoints;
for (int i = 0; i <= numPoints; i++) {
options.add(new LatLng(40.238068
+ semiVerticalAxis * Math.sin(i * phase),
116.501654 + semiHorizontalAxis
* Math.cos(i * phase)));
}
绘制椭圆
aMap.addPolygon(options.strokeWidth(25)
.strokeColor(Color.argb(50, 1, 1, 1))
.fillColor(Color.argb(50, 1, 1, 1)));
/**
* 生成一个长方形的四个坐标点
*/
private List<LatLng> createRectangle(LatLng center, double halfWidth,
double halfHeight) {
List<LatLng> latLngs = new ArrayList<>();
latLngs.add(new LatLng(center.latitude - halfHeight, center.longitude - halfWidth));
latLngs.add(new LatLng(center.latitude - halfHeight, center.longitude + halfWidth));
latLngs.add(new LatLng(center.latitude + halfHeight, center.longitude + halfWidth));
latLngs.add(new LatLng(center.latitude + halfHeight, center.longitude - halfWidth));
return latLngs;
}
/**
* 绘制不规则多边形
*/
// 定义多边形的5个点点坐标
LatLng latLng11 = new LatLng(40.742467, 116.842785);
LatLng latLng12 = new LatLng(39.893433, 116.124035);
LatLng latLng13 = new LatLng(39.058738, 116.463879);
LatLng latLng14 = new LatLng(39.873426, 116.838879);
LatLng latLng15 = new LatLng(40.8214661, 116.788097);
// 声明 多边形参数对象
PolygonOptions polygonOptions = new PolygonOptions();
// 添加 多边形的每个顶点(顺序添加)
polygonOptions.add(latLng11, latLng12, latLng13, latLng14, latLng15);
polygonOptions.strokeWidth(15) // 多边形的边框
.strokeColor(Color.argb(80, 1, 1, 1)) // 边框颜色
.fillColor(Color.argb(80, 1, 1, 1)); // 多边形的填充色
aMap.addPolygon(polygonOptions);
点平滑移动
/**
* 点平滑移动
*/
// 获取轨迹坐标点
List<LatLng> points=new ArrayList<>();
points.add(latLng11);
points.add(latLng12);
points.add(latLng13);
points.add(latLng14);
points.add(latLng15);
LatLngBounds bounds = new LatLngBounds(points.get(0), points.get(points.size() - 2));
aMap.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 50));
SmoothMoveMarker smoothMarker = new SmoothMoveMarker(aMap);
// 设置滑动的图标
smoothMarker.setDescriptor(BitmapDescriptorFactory.fromResource(R.mipmap.navi_map_gps_locked));
LatLng drivePoint = points.get(0);
Pair<Integer, LatLng> pair = SpatialRelationUtil.calShortestDistancePoint(points, drivePoint);
points.set(pair.first, drivePoint);
List<LatLng> subList = points.subList(pair.first, points.size());
// 设置滑动的轨迹左边点
smoothMarker.setPoints(subList);
// 设置滑动的总时间
smoothMarker.setTotalDuration(40);
// 开始滑动
smoothMarker.startSmoothMove();
绘制海量点
/**
* 设置海量点
*/
MultiPointOverlayOptions overlayOptions = new MultiPointOverlayOptions();
overlayOptions.icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(),R.mipmap.goodcar)));//设置图标
overlayOptions.anchor(0.5f,0.5f); //设置锚点
multiPointOverlay = aMap.addMultiPointOverlay(overlayOptions);
List<MultiPointItem> list = new ArrayList<>();
//创建MultiPointItem存放,海量点中某单个点的位置及其他信息
MultiPointItem multiPointItem = new MultiPointItem(latLng);
MultiPointItem multiPointItem2 = new MultiPointItem(latLng12);
MultiPointItem multiPointItem3 = new MultiPointItem(latLng13);
MultiPointItem multiPointItem4 = new MultiPointItem(latLng14);
list.add(multiPointItem);
list.add(multiPointItem2);
list.add(multiPointItem3);
list.add(multiPointItem4);
multiPointOverlay.setItems(list);//将规范化的点集交给海量点管理对象设置,待加载完毕即可看到海量点信息
// 定义海量点点击事件
AMap.OnMultiPointClickListener multiPointClickListener = new AMap.OnMultiPointClickListener() {
// 海量点中某一点被点击时回调的接口
// 返回 true 则表示接口已响应事件,否则返回false
@Override
public boolean onPointClick(MultiPointItem pointItem) {
Log.e("tag","海量点数据点击"+pointItem.getLatLng());
return false;
}
};
// 绑定海量点点击事件
aMap.setOnMultiPointClickListener(multiPointClickListener);
}