1. 程式人生 > >百度地圖新增自定義Marker+顯示覆蓋層次優先順序

百度地圖新增自定義Marker+顯示覆蓋層次優先順序

實際專案中經常會整合地圖,今天就只談談百度地圖新增自定義Marker這一部分,希望對百度地圖整合有這部分需求的小夥伴能有一些幫助。

百度地圖文件裡面對marker的新增只是很簡短的說了常用的新增圖示,但是如果專案中的需求有時候往往需要佈局比較複雜的覆蓋物

如果專案需求是點選Marker的時候才彈出某個佈局,那麼可以為Marker新增點選事件setOnMarkerClickListener來做彈出InfoWindow操作

//建立InfoWindow展示的view  
Button button = new Button(getApplicationContext());  
button.setBackgroundResource
(R.drawable.popup); //定義用於顯示該InfoWindow的座標點 LatLng pt = new LatLng(39.86923, 116.397428); //建立InfoWindow , 傳入 view, 地理座標, y 軸偏移量 InfoWindow mInfoWindow = new InfoWindow(button, pt, -47); //顯示InfoWindow mBaiduMap.showInfoWindow(mInfoWindow);
圖1

當然有時候需求是每個覆蓋物載入的時候就需要比較複雜的佈局時,這種方法顯然是不行的,這時候就需要我們通過自定義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);
這裡只是將圖片icon_marka資原始檔作為marker通過BitmapDescriptorFactory.fromResource進行載入,如果需要載入自定義的佈局

1.首先自己先寫好一個自己想要達到效果的佈局檔案,這裡就不再貼程式碼了。以圖1效果為例,若上方的button改為TextView,其實不改也可以。

2.定義一個獲取icon的方法,設定返回資料型別為BitmapDescriptor,例:

public BitmapDescriptor getBitmapDescriptor() {
        BitmapDescriptor bttmap = null;
        View item_view = LayoutInflater.from(activity).inflate(R.layout.frag_near_marker,null);
        TextView tv_storeName = (TextView) item_view.findViewById(R.id.frag_near_marker_tv_name);
        ImageView imageView = (ImageView) item_view.findViewById(R.id.frag_near_marker_iv_logo);

// 設定佈局中文字
        tv_storeName.setText("");

// 設定圖示
imageView.setImageResource(R.mipmap.home_icon_department);
        bttmap = BitmapDescriptorFactory.fromView(item_view);
        return bttmap;

}

這裡面呼叫的是百度地圖BitmapDescriptorFactory.fromView的方法載入一個佈局,而不再只是BitmapDescriptorFactory.fromResource載入圖片等資原始檔。

3.在MarkerOptions設定icon的時候傳入getBitmapDescriptor方法返回的資料即可。

這樣一來就可以實現每個Marker加載出來都能像圖1一樣的效果,而且點選事件是整個載入的佈局都有效。

其次來談一談顯示的優先順序問題,即想要讓哪個覆蓋物顯示在上層,哪些覆蓋物在縮小地圖視角的時候可以被其他覆蓋物覆蓋。

這裡給大家談一下兩個方法,如果只是想讓某個覆蓋物在縮小地圖視角的時候在追上層顯示,那麼可以考慮為Marker設定setTop()屬性來實現,引數傳入true或者false,如果是想為每一個Marker都編排顯示層次的優先順序,那麼可以考慮在設定MarkerOptions的時候呼叫zIndex()方法,引數傳入一個int型別的值,那麼Marker會根據這個值的大小來排列顯示層次的優先順序,值越大,就會顯示在越上層。

本部落格僅供參考,如有錯誤,歡迎指出。非常感謝!

附上百度地圖文件連結 百度地圖