关于百度地图(三)添加覆盖物自定义布局及遇到的一些bug解决方法
程序员文章站
2022-06-10 18:10:07
...
1.前面两篇写了百度地图的定位,但是我们使用地图显然不单单是定位,常用的一个就是添加marker覆盖物
这里添加marker的覆盖物,我单独写了一个方法出来,如下:
public void addMarker(final List<DBuildingInfo> list){
mapShowProgress(true);
new Thread(new Runnable() {
@Override
public void run() {
//建筑标志
Float lat,lng;
Marker marker = null;
LatLng point;//marker位置
// OverlayOptions textOption;//marker文字
ViewHolder viewHolder;
if (view == null) {
view = View.inflate(context,
R.layout.item_baidumap_marker, null);
viewHolder = new ViewHolder();
viewHolder.tvDbiName = (TextView)
view.findViewById(R.id.tv_dbiName);
viewHolder.tvDuiName = (TextView)
view.findViewById(R.id.tv_duiName);
viewHolder.imgMarker=(ImageView) view.findViewById(R.id.img_Marker);
view.setTag(viewHolder);
}
else {
viewHolder = (ViewHolder) view.getTag();
}
{***这里是我自己项目中的一个关于marker的逻辑处理***}
String[] latlng=list.get(i).getDbiMapposition().split(",");
lat=new Float(latlng[0]);
lng=new Float(latlng[1]);
BitmapDescriptor bitmapDescriptor=BitmapDescriptorFactory.fromView(view);
point = new LatLng(lng,lat);
// textOption = new TextOptions().position(point);
OverlayOptions option = new MarkerOptions()//构建MarkerOption,用于在地图上添加Marker
.position(point)
.icon(bitmapDescriptor)
.zIndex(5);
// mBaiduMap.addOverlay(option);//在地图上添加Marker,并显示
// mBaiduMap.addOverlay(textOption);//在地图上添加该文字对象并显示
marker = (Marker) (mBaiduMap.addOverlay(option));//将信息添加到Marker
marker.setAnchor(0.5f,0.5f);//设置经纬度的点在maker的中心点
marker.setZIndex(14);//设置marker的层级,层级越高,在地图上越在上面(会影响marker的点击事件)
Bundle bundle = new Bundle();//点击的marker的Bean信息
bundle.putSerializable("info", list.get(i));//key是"info"
marker.setExtraInfo(bundle);
if (list.size()==0||list.size()==i+1){
handler.sendEmptyMessage(HANDLE_MESSAGE);//加完marker的时候弹窗消失
}
}
}
}).start();
}
private static class ViewHolder {
public TextView tvDuiName;
public TextView tvDbiName;
public ImageView imgMarker;
}
可以看到,这里我自己写了一个布局,因为百度默认的还是不能满足我项目的要求。
加载marker是一个耗时过程,我new了一个新的线程来执行这一操作。
Marker的点击事件:在Activity中,实现onMarkerClick接口:
@Override
public boolean onMarkerClick(Marker marker) {
final DBuildingInfo info;
//获得marker中的数据
if (marker != null && marker.getExtraInfo() != null && marker.getExtraInfo().get("info") != null) {
//marker
info = (DBuildingInfo) marker.getExtraInfo().get("info");
showUnitInfoDialog(info);//好了,这样就拿到了点击的这个marker的数据,想拿去干嘛就拿去干嘛了
return true;
}
2.画几何图形。在官方文档中,我们可以看到介绍,可以画点(Dot)、折线(Polyline)、弧线(Arc)、圆(Circle)、多边形(Polygon)。并且给出了一个示例:
//定义多边形的五个顶点
LatLng pt1 = new LatLng(39.93923, 116.357428);
LatLng pt2 = new LatLng(39.91923, 116.327428);
LatLng pt3 = new LatLng(39.89923, 116.347428);
LatLng pt4 = new LatLng(39.89923, 116.367428);
LatLng pt5 = new LatLng(39.91923, 116.387428);
List<LatLng> pts = new ArrayList<LatLng>();
pts.add(pt1);
pts.add(pt2);
pts.add(pt3);
pts.add(pt4);
pts.add(pt5);
//构建用户绘制多边形的Option对象
OverlayOptions polygonOption = new PolygonOptions()
.points(pts)
.stroke(new Stroke(5, 0xAA00FF00))
.fillColor(0xAAFFFF00);
//在地图上添加多边形Option,用于显示
mBaiduMap.addOverlay(polygonOption);
非常简单,那如果我画一个圆呢,那我们就在工具类中写上一个方法,然后再activity里调用
public Overlay circleOverlay;
public void addRound(final LatLng latLng) {
//构建圆
OverlayOptions circleOptions = new CircleOptions()
.stroke(new Stroke(6, 0xAA4DB38A))
.fillColor(0)
.radius(150)
.center(latLng);
circleOverlay = mBaiduMap.addOverlay(circleOptions);
}
那如果删除这个呢:
public void removeRound() {
if (circleOverlay!=null) {
circleOverlay.remove();
}
}
上一篇: ora01747
下一篇: 根据类查找其所在的jar包