天天看點

關于百度地圖(三)添加覆寫物自定義布局及遇到的一些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[]);
                    lng=new Float(latlng[]);
                    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();
//                    mBaiduMap.addOverlay(option);//在地圖上添加Marker,并顯示
//                    mBaiduMap.addOverlay(textOption);//在地圖上添加該文字對象并顯示
                    marker = (Marker) (mBaiduMap.addOverlay(option));//将資訊添加到Marker
                    marker.setAnchor(f,f);//設定經緯度的點在maker的中心點
                    marker.setZIndex();//設定marker的層級,層級越高,在地圖上越在上面(會影響marker的點選事件)
                    Bundle bundle = new Bundle();//點選的marker的Bean資訊
                    bundle.putSerializable("info", list.get(i));//key是"info"
                    marker.setExtraInfo(bundle);
                    if (list.size()==||list.size()==i+){
                        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(, );  
LatLng pt2 = new LatLng(, );  
LatLng pt3 = new LatLng(, );  
LatLng pt4 = new LatLng(, );  
LatLng pt5 = new LatLng(, );  
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(, xAA00FF00))  
    .fillColor(xAAFFFF00);  
//在地圖上添加多邊形Option,用于顯示  
mBaiduMap.addOverlay(polygonOption);
           

非常簡單,那如果我畫一個圓呢,那我們就在工具類中寫上一個方法,然後再activity裡調用

public Overlay circleOverlay;
    public void addRound(final LatLng latLng) {
        //建構圓
        OverlayOptions circleOptions = new CircleOptions()
                .stroke(new Stroke(, ))
                .fillColor()
                .radius()
                .center(latLng);
        circleOverlay = mBaiduMap.addOverlay(circleOptions);
    }
           

那如果删除這個呢:

public void removeRound() {
        if (circleOverlay!=null) {
            circleOverlay.remove();
        }
    }
           

繼續閱讀