Appearance
在地图上绘制
Marker标记覆盖物
Marker标记覆盖物,可以用来标记地图上的点信息,包括但不限于:兴趣点、小车位置、乘客位置等。
添加Marker
代码如下:
java
// 从assets中加载一张名为"arrow.png"的bitmap
BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromAsset(this, "arrow.png");
// 创建MarkerOptions,为添加的Marker赋予必要的属性。position表示其地理坐标
markerOptions = new MarkerOptions().icon(bitmapDescriptor).position(new LatLng(40.0462780000,116.2858500000));
// 通过DiMap创建Marker
marker = diMap.addMarker(markerOptions);Marker销毁
java
// 调用remove()方法销毁marker
marker.remove();Marker动画
代码示例,该示例创建了一个透明度、旋转及缩放的组合动画,持续时间3秒钟:
java
AnimationSet animationSet = new AnimationSet(true);
// 添加透明度动画
animationSet.addAnimation(new AlphaAnimation(0f, 1f));
// 添加旋转动画
animationSet.addAnimation(new RotateAnimation(0f, 180f, 0f, 0f, 0f));
// 缩放动画
animationSet.addAnimation(new ScaleAnimation(1f, 2f, 1f, 2f));
// 设置持续时间
animationSet.setDuration(3000);
// 设置动画回调,会在开始和结束时通知调用方
marker.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart() {
Toast.makeText(MarkerActivity.this, "Animation start!", Toast.LENGTH_SHORT).show();
}
@Override
public void onAnimationEnd() {
Toast.makeText(MarkerActivity.this, "Animation end!", Toast.LENGTH_SHORT).show();
}
});
// 开启动画
marker.startAnimation(animationSet);InfoWindow
InfoWindow是Marker上的一个气泡,可通过setSnippet、setTitle创建默认的InfoWindow,也可以自定义其样式,做更加丰富复杂的气泡。
代码示例:
java
// 如下创建了一个带有InfoWindow的marker对象。其title和snippet设置了默认样式下的标题和文字片段,setInfoWindowEnable()开启InfoWindow
MarkerOptions markerOptions = new MarkerOptions().icon(BitmapDescriptorFactory
.defaultMarker())
.position(DIAMOND_BUILDING)
.title("标题")
.snippet("文字片段")
.setInfoWindowEnable(true);
Marker markerWithInfoWindow = diMap.addMarker(markerOptions);
// 显示InfoWindow
markerWithInfoWindow.showInfoWindow();
// 隐藏InfoWindow
markerWithInfoWindow.hideInfoWindow();InfoWindowAdapter
若希望自定义InfoWindow的样式,可使用DiMap.InfoWindowAdapter返回一个自定义View做更加灵活的定制显示:
java
marker.setInfoWindowAdapter(new DiMap.InfoWindowAdapter() {
@Override
public View getInfoWindow(Marker marker) {
TextView t = new TextView(context);
return t;
}
});
// 调用showInfoWindow()更新
marker.showInfoWindow();Polyline路线覆盖物
可以用来表示导航路线等。由一组经纬度来决定
java
// 如下代码添加了一条带路况的路线
Polyline line = diMap.addPolyline(
(new PolylineOptions())
.add(WULUMUQI, GUANGZHOU, DIGIT)
.width(20).multiColorLineInfo(infos)
.type(PolylineOptions.LineType.LINE_TYPE_MULTICOLOR));
// 删除路线
line.remove();上述代码中添加了一条路线。另外需注意的是,如上述代码所示,Polyline有2种类型,需在添加时即指定,
- 一种适合表达导航路线,type为PolylineOptions.LineType.LINE_TYPE_MULTICOLOR;
- 另一种适合表达更抽象意义上的几何路线,此时PolylineOptions.LineType.LINE_TYPE_ARGB
其他更详尽的信息可参考API文档。
圆形及多边形覆盖物
上述2种覆盖物分别可以绘制球面圆形,以及更为广泛的任意多边形,适合实现一些地理围栏等相关的功能。(实际Circle本质也是Polygon的一种,只不过特意开放方便开发者调用)
二者的不同在于API定义不同,circle由地理圆心(经纬度),及半径(米)定义;多边形由不少于3个的地理位置点定义。
以下仅以Circle为例,Polygon的代码类似,不再赘述。
java
// 定义了中心点、半径(1千米),边框颜色、填充色、及边框宽度
CircleOptions options = new CircleOptions().center(new LatLng(40.0498582224,116.2865710258))
.radius(1000).strokeColor(Color.BLACK)
.fillColor(Color.argb(50, 1,1,1)).strokeWidth(20);
circle = diMap.addCircle(options);
// 删除覆盖物
circle.remove();HeatOverlay绘制热力图
如下代码展示了如何添加一个热力图。
java
// step1 构造热力数据HeatDataNode,每个都包含了经纬度和热力值
ArrayList<HeatDataNode> nodes=new ArrayList<>();
nodes.add(new HeatDataNode(new LatLng(40.049072, 116.296159),1));
nodes.add(new HeatDataNode(new LatLng(40.059072, 116.296159),1));
nodes.add(new HeatDataNode(new LatLng(40.069072, 116.296159),1));
nodes.add(new HeatDataNode(new LatLng(40.079072, 116.296159),2));
nodes.add(new HeatDataNode(new LatLng(40.089072, 116.296159),2));
nodes.add(new HeatDataNode(new LatLng(40.099072, 116.296159),2));
nodes.add(new HeatDataNode(new LatLng(40.109072, 116.296159),3));
nodes.add(new HeatDataNode(new LatLng(40.119072, 116.296159),3));
nodes.add(new HeatDataNode(new LatLng(40.129072, 116.296159),3));
nodes.add(new HeatDataNode(new LatLng(40.139072, 116.296159),4));
nodes.add(new HeatDataNode(new LatLng(40.149072, 116.296159),4));
// step2 添加热力图
HeatOverlayOptions options = new HeatOverlayOptions().
nodes(nodes).radius(100);
HeatOverlay heatOverlay = diMap.addHeatOverlay(options);
// step3 删除热力图
heatOverlay.remove();