关于百度地图(三)添加覆盖物自定义布局及遇到的一些bug解决方法

来源:互联网 发布:皓思网络 编辑:程序博客网 时间:2024/05/19 16:35

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();        }    }
阅读全文
0 0
原创粉丝点击