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

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
百度地图提供了自定义覆盖物的功能,您可以使用该功能在地图上添加自定义的标记、图标、信息窗口等元素。 首先,您需要在地图上创建一个自定义覆盖物对象。您可以继承百度地图API的`Overlay`类,实现自己的覆盖物对象。例如,您可以创建一个自定义标记的覆盖物对象: ```javascript function CustomMarker(point) { this._point = point; } CustomMarker.prototype = new BMap.Overlay(); CustomMarker.prototype.initialize = function (map) { this._map = map; var div = document.createElement('div'); div.style.position = 'absolute'; div.style.backgroundColor = 'red'; div.style.width = '20px'; div.style.height = '20px'; div.innerHTML = '自定义标记'; map.getPanes().markerPane.appendChild(div); this._div = div; return div; }; CustomMarker.prototype.draw = function () { var pixel = this._map.pointToOverlayPixel(this._point); this._div.style.left = pixel.x - 10 + 'px'; this._div.style.top = pixel.y - 10 + 'px'; }; ``` 然后,在地图上添加自定义覆盖物对象。您可以使用百度地图API的`Overlay`类的`initialize()`方法和`draw()`方法来实现添加和绘制自定义覆盖物。例如: ```javascript var map = new BMap.Map("mapContainer"); var point = new BMap.Point(116.404, 39.915); map.centerAndZoom(point, 15); var customMarker = new CustomMarker(point); map.addOverlay(customMarker); ``` 以上代码创建了一个地图对象,设置地图中心点和缩放级别,然后创建了一个自定义标记的覆盖物对象,并将其添加到地图上显示。 除了自定义标记,您还可以创建其他类型的自定义覆盖物,例如自定义图标、信息窗口等。具体的实现方法可以根据您的需求进行调整。您可以参考百度地图API的文档,了解更多关于自定义覆盖物的相关信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值