点标记用来在地图上标记任何位置,例如用户位置、车辆位置、店铺位置等一切带有位置属性的事物。
地图 SDK 提供的点标记功能包含两大部分,一部分是点(俗称 Marker)同时,SDK 对 Marker 封装了大量的触发事件,例如点击事件、长按事件、拖拽事件。
由于内容丰富,以下只能展示一些基础功能的使用,详细内容可参考类参考文档。
开发者可以根据自己实际的业务需求,利用标注覆盖物,在地图指定的位置上添加标注信息。开发者通过MarkerOptions类来设置Marker的属性。
绘制Marker的代码如下:
//定义Maker坐标点 LatLng point = new LatLng(39.963175, 116.400244); //构建Marker图标 BitmapDescriptor bitmap = BitmapDescriptorFactory .fromResource(R.drawable.icon_marka); //构建MarkerOption,用于在地图上添加Marker OverlayOptions option = new MarkerOptions() .position(point) .icon(bitmap); //在地图上添加Marker,并显示 mBaiduMap.addOverlay(option);
可根据实际的业务需求,在地图指定的位置上添加自定义的 Marker。MarkerOptions 是设置 Marker 参数变量的类,添加 Marker 时会经常用到。
Marker常用属性:
名称 | 说明 | |
icon | 设置图标 | |
animateType | 动画类型 | MarkerAnimateType.none |
MarkerAnimateType.drop | ||
MarkerAnimateType.grow | ||
MarkerAnimateType.jump | ||
alpha | 透明度 | |
position | 位置坐标 | |
perspective | 是否开启近大远小效果 | true |
false | ||
draggable | 是否可拖拽 | |
flat | 是否平贴地图 (俯视图)(双手下拉地图查看效果) | true |
false | ||
anchor | 锚点比例 | |
rotate | 旋转角度 | |
title | 设置标题 | |
visible | 是否可见 | |
extraInfo | 额外信息 |
自定义Marker示例
//定义Maker坐标点 LatLng point = new LatLng(39.944251, 116.494996); //构建Marker图标 BitmapDescriptor bitmap = BitmapDescriptorFactory .fromResource(R.drawable.marker_custom); //构建MarkerOption,用于在地图上添加Marker OverlayOptions option = new MarkerOptions() .position(point) //必传参数 .icon(bitmap) //必传参数 .draggable(true) //设置平贴地图,在地图中双指下拉查看效果 .flat(true) .alpha(0.5f); //在地图上添加Marker,并显示 mBaiduMap.addOverlay(option);
效果如图:
Marker点击事件
点击Marker时会回调BaiduMap.OnMarkerClickListener,监听器的实现方式示例如下:
mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() { //marker被点击时回调的方法 //若响应点击事件,返回true,否则返回false //默认返回false @Override public boolean onMarkerClick(Marker marker) { return false; } });
Marker拖拽事件
在拖拽Marker时会回调BaiduMap.OnMarkerDragListener,监听器的实现方式如下(要在构造MarkerOptions时开启draggable):
mBaiduMap.setOnMarkerDragListener(new BaiduMap.OnMarkerDragListener() { //在Marker拖拽过程中回调此方法,这个Marker的位置可以通过getPosition()方法获取 //marker 被拖动的Marker对象 @Override public void onMarkerDrag(Marker marker) { //对marker处理拖拽逻辑 } //在Marker拖动完成后回调此方法, 这个Marker的位可以通过getPosition()方法获取 //marker 被拖拽的Marker对象 @Override public void onMarkerDragEnd(Marker marker) { } //在Marker开始被拖拽时回调此方法, 这个Marker的位可以通过getPosition()方法获取 //marker 被拖拽的Marker对象 @Override public void onMarkerDragStart(Marker marker) { } });
自V3.6.0版本起,SDK在BaiduMap提供了控制底图标注的showMapPoi方法,默认显示底图标注。利用此属性可得到仅显示道路信息的地图,方法如下:
mBaiduMap.showMapPoi(false);
运行后,底图标注被隐藏,效果如图:
Android 7.5.0 起地图SDK支持marker碰撞策略功能,并兼容之前的marker绘制功能,只有打开isJoinCollision开关才进行碰撞策略。
marker碰撞策略可检测屏幕中海量marker的碰撞情况,并自动更新marker状态,确保屏幕中的marker互不碰撞。
Marker碰撞策略的主要属性如下:
属性 |
类型 |
说明 |
isJoinCollision |
boolean |
是否参与碰撞,默认值为false |
isForceDisplay |
boolean |
参与碰撞后是否强制展示,默认值为false |
priority |
int |
碰撞优先级,默认值为整型的最大值 |
startLevel |
int |
最小展示层级,默认值为4 |
endLevel |
int |
最大展示层级,室内默认22,室外默认21 |
实现marker碰撞策略前,请提前准备好带经纬度信息的数据集,具体实现方式如下:
LatLng latlng = new LatLng(39.94871, 116.43784); markerOptions = new MarkerOptions() .position(latlng)// 设置marker经纬度坐标 .icon(bitmap)// 设置 Marker 覆盖物的图标 .isJoinCollision(true)// 设置marker参与碰撞 .isForceDisPlay(true) //设置压盖时 marker强制展示 .priority(9)//设置碰撞优先级为9 mMarker = (Marker) (mBaiduMap.addOverlay(markerOptions));//将marker添加到地图上
Android 7.5.2 起 地图SDK提供3D Marker绘制功能,支持对带高度的Marker覆盖物绘制,以满足更多场景需求。如下示例图就是将3D Marker绘制到3D建筑物上,并与3D建筑物绑定。 示例图如下
添加3D Marker的流程如下:
1、设置3D Marker高度:
Int height = 100; //
2、将带有高度的Marker的位置信息转换成二维屏幕坐标:
Point srcPoint = projection.geoPoint3toScreenLocation(new LatLng(23.008468, 113.72953), 100);
3、再将二维屏幕坐标转换成对应的经纬度坐标:
LatLng latLng = projection.fromScreenLocation(srcPoint)
之后就可以像添加普通覆盖物一样将3D Marker添加到地图上了。
自v7.5.7起,百度地图SDK支持Marker覆盖物添加title功能,支持自定义Marker的title样式,包括:title大小、title颜色、title背景框颜色、title锚点、title偏移量、title旋转角度等。
通过创建TitleOptions为Marker添加title,TitleOptions有如下属性:
属性名 | 说明 |
titleBgColor |
文字背景框颜色 |
titleFrontColor |
文字颜色 |
titleFrontSize |
文字大小 |
titleAnchorX |
文字X锚点 |
titleAnchorY |
文字Y锚点 |
titileOffsetX |
文字水平偏移量 |
titileOffsetY |
文字竖直偏移量 |
titleRotate |
文字旋转角度 |
自v7.5.7起,百度地图SDK支持Marker及其title可碰撞地图poi。
Marker新增如下属性:
属性名 |
说明 |
titleOptions |
title选项 |
poiCollided |
是否碰撞poi |
Marker添加title并碰撞poi示例代码:
TitleOptions titleOptions = new TitleOptions() .text("我是A") .titleBgColor(Color.RED) .titleFontSize(48); MarkerOptions markerOptions = new MarkerOptions() .position(point) // 设置 Marker 覆盖物坐标 .titleOptions(titleOptions) // 设置 Marker 覆盖物文字 .icon(bitmap)// 设置 Marker 覆盖物的图标 .poiCollided(true); // 设置marker是否能碰撞poi mBaiduMap.addOverlay(markerOptions);
https://mapopen-pub-androidsdk.cdn.bcebos.com/map/7_5_7/point_mark.mp4